JPQL在select语句中创build新对象 – 避免还是拥抱?

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

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

这是要避免还是要拥抱? 根据良好的做法,何时使用这个function是合理的?

不要回避它 ,SELECT NEW就在那里,因为在第10.2.7.2节中提到它有完全有效的用例 JPQL构造器expression式在 EJB 3.0 JPA规范 的SELECT子句中:

可以在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 

简而言之,如果您不想以types安全的方式(而不是Object[] )检索完整实体或对象的完整graphics,请使用SELECT NEW。 无论您将查询的结果映射到实体类还是非映射类都将取决于您的select。 一个典型的例子是一个列表屏幕(你可能不需要所有的细节)。

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

当您要检索数据传输对象时,您经常使用这种查询。 也许报告可以成为使用它的好地方。 如果你只想检索一个域对象(比如来自Family ),那么没有理由使用它。

用new创build的对象不一定是DTO,即将由Business层输出的Object。 它也可以是POJO域对象,即业务层内部使用的对象。

使用这种types的POJO作为部分对象而不是完整的JPA实体的原因是在特定types的JOINS中的性能。 一个很好的资源解释这是: http : //use-the-index-luke.com/sql/join/hash-join-partial-objects