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中有效?
答案 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].