我最近了解到可以在JPQL
语句中创建新对象,如下所示:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
这是要避免还是要拥抱?根据良好做法,何时使用此功能是合理的?
答案 0 :(得分:106)
不要避免,SELECT NEW就在那里,因为在§10.2.7.2中提醒它有完全有效的用例。 EJB 3.0 JPA Specification的:
可以使用构造函数 SELECT列表返回一个或多个Java 实例。指定的类不是 必须是一个实体或是 映射到数据库。的的 构造函数名称必须完整 合格。强>
如果指定了实体类名称 在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
简而言之,当您不希望以类型安全的方式检索完整实体或完整的对象图时(而不是Object[]
),请使用SELECT NEW。是否在实体类或非映射类中映射查询结果将取决于您的选择。一个典型的例子是列表屏幕(您可能不需要所有细节)。
换句话说,不要在任何地方使用它,但不要禁止它使用(很少有东西只是黑色或白色)。
答案 1 :(得分:26)
当您想要检索数据传输对象时,通常会使用此类查询。也许报告可以是一个使用它的好地方。如果您只想检索单个域对象(例如来自Family 的),那么没有理由使用它。
答案 2 :(得分:6)
使用new创建的对象不必是DTO,即将由Business层导出的Object。它也可以是POJO域对象,即业务层内部使用的对象。
使用这种POJO作为部分Object而不是完整的JPA实体的原因是在特定种类的JOINS中的性能。解释这一点的一个很好的资源是:http://use-the-index-luke.com/sql/join/hash-join-partial-objects