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

StackOverflow https://stackoverflow.com/questions/2355728

Вопрос

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

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

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

Это было полезно?

Решение

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

Конструктор может использоваться в списке Select, чтобы вернуть один или несколько экземпляров Java. Указанный класс не обязан быть объектом или быть отображенным в базу данных. Имя конструктора должно быть полностью квалифицированным.

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top