一尘不染

JPQL在Select语句中创建新对象-避免还是拥抱?

hibernate

我最近了解到,可以在JPQL语句中创建新的对象,如下所示:

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

这是要避免的事情还是应该接受?根据良好实践,何时才可以合理使用此功能?


阅读 292

收藏
2020-06-20

共1个答案

一尘不染

不要回避它 ,因为有第 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

简而言之,当您不想以类型安全的方式(而不是Object[])检索完整的实体或对象的完整图形时,请使用SELECT NEW
。您将查询结果映射到实体类还是非映射类将取决于您的选择。一个典型的示例是列表屏幕(您可能不需要所有详细信息)。

换句话说,不要在任何地方都使用它,但不要禁止它的使用(很少有东西是黑色或白色的)。

2020-06-20