例如,我有两个实体:Employee和Address。在这些enitities中,Employee有一个外键AddressID引用Address上的ID列。在Java域对象中,Hibernate使用Address对象字段很好地包装了forgein键整数字段。但是现在,我怎么能用一个AddressID查询Employee?
我试图创建一个表别名。这似乎有效,但它相当尴尬。
我也尝试过这样的事情:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
它有效,但并非总是如此。我不确定这是正确的方法,但我希望它能一直这样。
那么在hibernate中查询外键列的正确方法是什么?
答案 0 :(得分:73)
Hibernate“很好地包装”你告诉它包装的内容。因此,假设您的Employee
映射看起来像:
@Entity
public class Employee {
...
@ManyToOne
@JoinColumn(name="address_id")
private Address address;
...
}
并且您的Address
有id
属性,您可以根据address_id
通过以下方式进行查询:
session.createCriteria(Employee.class)
.add(Restrictions.eq("address.id", addressId));
要根据Address
属性进行查询,您必须create aliases or nested criteria:
session.createCriteria(Employee.class)
.createAlias("address", "a")
.add(Restrictions.eq("a.postalCode", postalCode));
答案 1 :(得分:4)
有类似的麻烦... @ChssPly76答案工作正常,但只是找到解决方案如果外键不是父表中Id的一部分 - 你必须通过添加“referencedColumnName”来修改注释:
@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;
然后你可以创建标准:
criteria.add(restriction.eq("address.addrUniqueFieldName", 123);