使用 @NamedQuery 和 'SELECT OBJECt(var) FROM EntityName var 实现查询

Posted

技术标签:

【中文标题】使用 @NamedQuery 和 \'SELECT OBJECt(var) FROM EntityName var 实现查询【英文标题】:Implementing a Query Using @NamedQuery with a 'SELECT OBJECt(var) FROM EntityName var使用 @NamedQuery 和 'SELECT OBJECt(var) FROM EntityName var 实现查询 【发布时间】:2016-11-18 17:01:05 【问题描述】:

我已经开始学习 JPA,我在很多网站上搜索过,但找不到关于这个例子的解释:

使用@NamedQuery 实现查询:

   @Entity
   @NamedQuery(
    name="findAllEmployeesByFirstName",
    queryString="SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = 'John'"
)
public class Employee implements Serializable 
...

我只是不明白为什么作者要选择一个 Object(emp)..为什么他不使用这样的东西 SELECT emp FROM Employee emp WHERE emp.firstName = 'John'

有区别吗?我错过了什么吗?

【问题讨论】:

【参考方案1】:
SELECT OBJECT(emp) FROM Employee emp

完全一样

SELECT emp FROM Employee emp

请参阅 JPA 规范。 [69] 请注意,关键字 OBJECT 不是必需的。对于新查询,最好将其省略。

“OBJECT”起源于 EJB(现已过时)。

【讨论】:

感谢您抽出宝贵时间回答@Neil!【参考方案2】:

它们是选择实体时的同义词表达式。 在 Java 中声明 interface 时也是一样的,你可以声明 abstract interface,但它更长而且什么也没有,所以没有人这样做。

【讨论】:

【参考方案3】:

不同之处在于,即使路径表达式可以解析为实体类型,OBJECT 关键字的语法也仅限于标识变量。

您可以安全地从查询中删除 OBJECT。

举个例子,如果 Employee 与 Department 实体有关系,那么使用 object 的查询是非法的:

SELECT OBJECT(emp.department) FROM Employee emp WHERE emp.firstName = 'John'  // Not valid
SELECT emp.department FROM Employee emp WHERE emp.firstName = 'John' // Valid

【讨论】:

解释有点复杂,但你是对的。好的例子。 +1

以上是关于使用 @NamedQuery 和 'SELECT OBJECt(var) FROM EntityName var 实现查询的主要内容,如果未能解决你的问题,请参考以下文章

动态更改 NamedQuery

如何在 NamedQuery 中编写 NamedQuery hasrsine 公式?

NamedQuery 返回具有空字段的实体

如何按在 sql/namedQuery 中找到的关键字数量排序

使用 eclipselink 和 @namedquery 进行错误转换

JPA NamedQuery 与聚合函数和分组依据一起使用