当前位置: 首页 > 面试题库 >

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

仲孙夕
2023-03-14
问题内容

我最近了解到,可以在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

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

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



 类似资料:
  • 问题内容: 例如: 相对于: 一个比另一个更有效吗? 问题答案: 返回之前分配给临时变量使您有机会从newPerson()中进行错误检查和更正。返回新的调用要求newPerson()方法的调用者捕获错误并从错误中恢复。

  • 我有一个连接两个表的非常简单的连接表,为了简化问题,我们可以说表1是a,表2是B,有一个连接表AB。 其中A_id_fk和B_id_fk分别是外键。我试图创建一个查询来检索a中与B有关系的所有行,所以我的函数接收B_id作为参数,我想搜索AB以获得B_id_fk==B_id的所有行,然后使用搜索a搜索A_id==上一次搜索返回的A_id_fk的所有行。 我进行了测试,可以在简单的SQL中使用嵌套的

  • 需要在一个PDF文件中导出所有的表单,所以我找到了这段代码,它工作(导出一个单PDF,每个表单有一页)。但是我不想使用select/active语句,我更喜欢使用存储对象的变量。 问题:在这段代码中如何避免select/ActiveSheet?

  • 问题内容: 我想将此SQL语句转换为JPQL等效项。 这样可以正确地从表中检索信息。 在我的实体中 到目前为止,这是我所拥有的,但是它不起作用。 我究竟做错了什么?谢谢。 问题答案: 试试这个查询(替换用):

  • 下面是下一个JPQL查询: 返回具有3个值的me对象: 如何使用JPQL通过参数对结果进行排序?或者也许还有其他方法可以选择? 谢谢

  • 问题内容: 在MS2000中工作,我有一个名为JobOwners的表,该表将Jobs(JPSID)映射到拥有它们的雇员(EmpID)。它还包含他们开始拥有该工作的日期(DateStarted),他们停止拥有该工作的日期(DateEnded)以及所有权是否处于活动状态(IsActive)。看起来像这样。 尽管没有活动的重复应该没问题,但不应有活动的JPSID重复。通过一些研究,我发现可以使用CHEC