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