Подтвердить что ты не робот

JPQL Создать новый объект в Select Statement - избегать или объявлять?

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

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

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

4b9b3361

Ответ 1

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

Конструктор может использоваться в SELECT для возврата одной или нескольких 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[]). Независимо от того, сопоставляете ли вы результат запроса в классе сущности, или не сопоставленный класс будет зависеть от вашего выбора. Типичным примером может служить экран списка (где вам могут не понадобиться все детали).

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

Ответ 2

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

Ответ 3

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

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