JPQL Создать новый объект в операторе выбора - избежать или обнять? - PullRequest
56 голосов
/ 01 марта 2010

Недавно я узнал, что можно создавать новые объекты в JPQL инструкциях следующим образом:

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

Это что-то, чего следует избегать или, скорее, принять? Когда использование этой функции оправдано в свете передовой практики?

Ответы [ 3 ]

107 голосов
/ 02 марта 2010

Не избегайте этого , там есть SELECT NEW, потому что для него есть совершенно допустимые варианты использования, как указано в §10.2.7.2. Выражения конструктора JPQL в предложении SELECT спецификации JPA EJB 3.0 :

Конструктор может использоваться в ВЫБЕРИТЕ список для возврата одного или нескольких Java экземпляров. Указанный класс не должен быть субъектом или быть сопоставлены с базой данных. The имя конструктора должно быть полностью Квалифицированный.

Если указано имя класса сущности в предложении SELECT NEW, Полученные экземпляры сущности находятся в новое состояние.

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)
FROM Customer c JOIN c.orders o
WHERE o.count > 100

Короче говоря, используйте SELECT NEW, если вы не хотите извлекать полную сущность или полный граф объектов безопасным способом (в отличие от Object[]). Отобразите ли вы результат запроса в классе сущности или в не сопоставленном классе, будет зависеть от вашего выбора. Типичным примером может быть экран списка (в котором вам могут не понадобиться все детали).

Другими словами, не используйте его повсюду, но не запрещайте его использование (мало что может быть только черным или белым).

26 голосов
/ 01 марта 2010

Этот тип запроса часто используется, когда вы хотите получить Объект передачи данных . Может быть, отчет может быть хорошим местом для его использования. Если вы просто хотите получить один объект домена (например, из семейства ), то нет причин использовать его.

6 голосов
/ 04 апреля 2015

Объект, созданный с помощью new, не обязательно должен быть DTO, то есть объектом, который будет экспортироваться бизнес-уровнем. Это также может быть объект домена POJO, то есть объект, используемый внутри бизнес-уровнем.

Причиной использования этого вида POJO в качестве частичного объекта вместо полного объекта JPA является производительность в определенных видах JOINS. Большой ресурс, который объясняет это: http://use -the-index-luke.com / sql / join / hash-join-частичный-объекты

...