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