我最近了解到,可以在JPQL语句中创建新的对象,如下所示:
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节 所提醒的,因为它有完全有效的用例,所以这里有SELECT NEW 。 EJB 3.0 JPA规范 的SELECT子句 中的 JPQL构造函数表达式 :
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
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 。您将查询结果映射到实体类还是非映射类将取决于您的选择。一个典型的示例是列表屏幕(您可能不需要所有详细信息)。
Object[]
换句话说,不要在任何地方都使用它,但不要禁止它的使用(很少有东西是黑色或白色的)。