Использование нового оператора в запросе JPQL - PullRequest
2 голосов
/ 07 января 2020

Я использую new в запросе JPQL следующим образом

select 
  ob.property1,
  NEW package1.CustomObject(item, dimension, material, product)
from mainTable ob
LEFT JOIN ....

Приложение жалуется на кому после ob.property1, говоря, что это неожиданный токен. Кажется, вы не можете использовать несколько столбцов с new внутри предложения select. Можете ли вы помочь мне

1 Ответ

2 голосов
/ 13 января 2020

Согласно this у вас есть следующие опции:

  1. Обтекание значений в типобезопасном Java объекте, который будет возвращен в качестве результата запроса.
select new package1.CustomObject(item, dimension, material, product)
from MainTable ...

Класс проекции должен быть полностью квалифицирован в запросе сущности и должен определять соответствующий конструктор. Класс здесь не нужно отображать. Это может быть класс DTO. Если он действительно представляет сущность, полученные экземпляры возвращаются в состоянии NEW (не управляется!).

HQL поддерживает дополнительные функции «dynamici c instantiation».

В запросе можно указать возвращение List вместо Object[] для скалярных результатов.
select new list(item, dimension, material, product)
from MainTable ...

Результатами этого запроса будут List<List> как в отличие от List<Object[]>.

Обтекание скалярных результатов в Map
select new map(
  item as iName,
  dimension as iDimension,
  material as iMaterial,
  product as iProduct)
from MainTable ...

Результатом этого запроса будет List<Map<String, Object>>, а не List<Object[]>. Ключи карты определяются псевдонимами, заданными в выражениях выбора. Если пользователь не назначает псевдонимы, ключом будет индекс каждого конкретного столбца набора результатов (например, 0, 1, 2 и т. Д. c).

...