JPQL创建新对象在Select语句 - 避免或拥抱?
题
我最近了解到,有可能创造JPQL
声明新的对象如下:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
是要避免或者说接受这种东西吗?当在这种特征的使用中的良好实践光合理?
解决方案
不要躲避它下,选择新有,因为有非常有效的用例作为在§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,即将由业务层被导出的Object。它也可以是一个POJO域对象,即,由商业层内部使用的Object。
使用这种的POJO作为部分对象,而不是完整JPA实体的原因是在特定类型的联接性能。这也解释了这个伟大的资源是: HTTP://使用-the-index-luke.com/sql/join/hash-join-partial-objects
不隶属于 StackOverflow