выражения конструктора 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 невозможно иметь выражения пути с коллекционным значением.