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

时间:2016-07-15 13:04:20

标签: java jpa select entity

我已经开始学习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'

有区别吗?我想念一下吗?

3 个答案:

答案 0 :(得分:3)

SELECT OBJECT(emp) FROM Employee emp

完全相同
SELECT emp FROM Employee emp

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

不同之处在于,即使路径表达式可以解析为实体类型,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