我可以通过名称“id”引用JPQL中任何实体的主键,而不管实体的ID属性名称是什么?

时间:2010-06-21 16:31:45

标签: hibernate orm jpa jpql jpa-2.0

Hibernate允许你只说“.id”。假设我有:

@Entity public class Customer {
  @Id private Integer customerId;
  @Basic private String customerName;
  // getters and setters
}

我希望通过ID获取客户名称:

SELECT cust.customerName FROM Customer cust WHERE cust.id = :customerId

注意我将“id”而不是“customerId”作为快捷方式。这是有效的JPQL,还是仅在Hibernate中有效?

1 个答案:

答案 0 :(得分:2)

JPA规范没有定义这样的快捷方式,对状态字段(包括Id属性)的访问是按名称进行的:

  

4.3抽象模式类型和查询域

     

(...)

     

非正式地,抽象模式类型   实体的特征可以表征为   如下:

     
      
  • 对于每个持久的领域   或获取访问方法(对于   实体的持久性)   上课,有一个领域   (“state-field”)其抽象模式   type对应于该字段的类型   或访问者的结果类型   方法
  •   
  • 对于每一个持久性   关系字段或获取访问者   方法(用于持久关系   那个实体类的属性)   是一个字段(“关联字段”),其中   type是抽象模式类型   相关实体(或者,如果是   关系是一对多或   多对多,这样的集合。)
  •   
     

(...)

换句话说,这是特定于Hibernate的(参见14.5. Referring to identifier property部分),所以如果你想编写JPQL,不要依赖它。


这是EclipseLink的例子(MyEntity没有id字段):

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [select e from MyEntity e where e.id = :id], line 1, column 33: unknown state or association field [id] of class [com.acme.MyEntity].