实现了“选择对象(VAR)FROM实体名称VAR查询中使用@NamedQuery

问题描述:

我已经开始学习JPA和我搜索过许多网站和我找不到关于这个例子的说明:实现了“选择对象(VAR)FROM实体名称VAR查询中使用@NamedQuery

实施查询中使用@NamedQuery:

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

我只是不明白为什么笔者选择对象(EMP)..他为什么不使用这样的SELECT emp FROM Employee emp WHERE emp.firstName = 'John'

是否有区别?我想念什么?

区别在于即使路径表达式可以解析为实体类型,但OBJECT关键字的语法仅限于识别变量。

您可以安全地从查询中删除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 
+0

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

SELECT OBJECT(emp) FROM Employee emp 

是完全相同的

SELECT emp FROM Employee emp 

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

“OBJECT”的起源在EJB(现在已过时)中。

+0

感谢您的时间来回答@Neil! – Andreea

它们在选择实体时是同义词表达式。 当你在Java中声明interface时,你可以声明abstract interface,但它更长,并且什么都不带,所以没有人会这样做。

+0

谢谢@davidhxxx! – Andreea

+0

欢迎您:) – davidxxx