выражения конструктора jpa с несколькими операторами SELECT NEW

есть ли способ иметь несколько SELECT NEW заявления в jpql запрос (спящий режим)?

это работает для меня:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r) "
        +" FROM Item g, Service s, Service l , Service r"
        +" WHERE s.id = g.id" 
        +" AND s.location = l.name"
        +" AND s.serviceType = 'type'"
        +" AND l.serviceType = 'Location'"
        +" AND l.area = r.name" 
        +" AND r.serviceType = 'Region'")
public List<Item> getAllItemsWithServices();

я получаю ожидаемый результат в моем DTO.

@Component
public class ItemServiceDTO{

    private Item item;
    private Service serviceType;
    private Service serviceLocation;
    private Service serviceRegion;

    public ItemServiceDTO(item item, Service serviceType, Service serviceLocation, Service serviceRegion) {
        super();
        this.item = item;
        this.serviceType = serviceType;
        this.serviceLocation = serviceLocation;
        this.serviceRegion = serviceRegion;
    }

но я хочу иметь новый экземпляр Language с подрядчиком.

например, вот так:

 @Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r), new LanguageDTO()"
            +" FROM Item g, Service s, Service l , Service r"

или в подселекте ItemService

 @Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r, new LanguageDTO())"
                +" FROM Item g, Service s, Service l , Service r"

я также заинтересован в использовании Map и List в моем DTO возражает, но я читаю, что это невозможно? Это правда?

мое приложение Spring boot начинается с ошибок при использовании двух примеров.

В конце я хочу карту Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

1 ответов


технически, по определению предложения JPQL select, это позволило бы несколько выражений конструктора.

  • select_clause :: = SELECT [DISTINCT] select_expression {, select_expression}*
  • select_expression :: = single_valued_path_expression | aggregate_expression | identification_variable/
    OBJECT (identification_variable) | constructor_expression
  • constructor_expression :: = новое имя конструктора ( constructor_item {, constructor_item}*)
  • constructor_item :: = single_valued_path_expression / aggregate_expression
  • aggregate_expression :: = { AVG / MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) / COUNT ([DISTINCT]
    identification_variable | state_field_path_expression/
    single_valued_association_path_expression)

пример:

SELECT NEW com.test.model.UserName(u.firstname, u.lastname), NEW com.test.model.UserEmail(u.email) FROM User u

тем не менее, я только что обнаружил что Hibernate не позволит. Когда я переключил провайдера JPA из спящего режима в EclipseLink, он работает. Таким образом, вам может потребоваться проконсультироваться с поставщиком, если такой синтаксис запроса разрешен.

обратите внимание, однако, что при использовании оператора NEW ваш конструктор должен иметь аргументы (по крайней мере один). Поэтому это выражение не будет работать:

SELECT NEW LanguageDTO()

на ваш второй вопрос, Можно ли использовать List и Map, Я совсем запуталась, как вы хотели бы использовать эти коллекции в вашем запросе. Однако обратите внимание, что в предложении SELECT в соответствии с определением JPQL SELECT_CLAUSE невозможно иметь выражения пути с коллекционным значением.