2

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 中有效?

4

1 回答 1

2

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

4.3 抽象模式类型和查询域

(...)

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

  • 对于实体类的每个持久字段或获取访问器方法(对于持久属性),都有一个字段(“状态字段”),其抽象模式类型对应于该字段或访问器方法的结果类型。
  • 对于实体类的每个持久关系字段或获取访问器方法(对于持久关系属性),都有一个字段(“关联字段”),其类型是相关实体的抽象模式类型(或者,如果关系是一对多或多对多,这样的集合)。

(...)

换句话说,这是特定于 Hibernate 的(参见第14.5 节。参考标识符属性),所以如果您想编写 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].
于 2010-06-21T19:50:02.553 回答