有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用@NamedQuery和EntityName变量中的“选择对象(var)”实现查询

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

使用@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'

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


共 (3) 个答案

  1. # 1 楼答案

    SELECT OBJECT(emp) FROM Employee emp
    

    完全一样

    SELECT emp FROM Employee emp
    

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

    “OBJECT”的起源是在ejb中(现在已经过时了)

  2. # 2 楼答案

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

    选择实体时,它们是同义表达式。 在Java中声明interface也是一样的,可以声明abstract interface但是它更长,而且没有带来任何东西,所以没有人这样做