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

2022-08-31 13:57:25

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

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

这是应该避免的还是更确切地说是要接受的?根据良好做法,何时可以证明使用此功能是合理的?


答案 1

不要回避它,SELECT NEW之所以存在,是因为正如§10.2.7.2中提醒的那样,它有完全有效的用例。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 NEW(而不是 )。是在实体类中映射查询结果还是在非映射类中映射查询结果将取决于你的选择。一个典型的例子是列表屏幕(您可能不需要所有详细信息)。Object[]

换句话说,不要到处使用它,但不要禁止使用它(很少有东西只是黑色或白色的)。


答案 2

当您想要检索数据传输对象时,通常使用此类查询。也许报表可以是使用它的好地方。如果您只想检索单个域对象(例如从 Family 中检索),则没有理由使用它。


推荐