使用 @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 hasrsine 公式?
如何按在 sql/namedQuery 中找到的关键字数量排序