Hibernate查询带有ID的外键字段
Posted
技术标签:
【中文标题】Hibernate查询带有ID的外键字段【英文标题】:Hibernate query a foreign key field with ID 【发布时间】:2010-12-19 17:09:06 【问题描述】:例如,我有两个实体:Employee 和 Address。在这些实体中,Employee 有一个外键 AddressID 引用 Address 上的 ID 列。在 Java 域对象中,Hibernate 很好地用地址对象字段包装了伪造键整数字段。但是现在,我如何查询具有某个 AddressID 的 Employee 呢?
我已尝试创建表别名。这似乎有效,但它相当尴尬。
我也尝试过这样做:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
它在一段时间内有效,但并非总是如此。我不确定这是正确的方法,但我一直希望它可以。
那么在hibernate中查询外键列的正确方法是什么?
【问题讨论】:
我要问:为什么Employee有地址的ID字段?一名员工不能拥有多个地址吗? Address 对象有一个员工的 ID 字段不是更有意义吗?最后,更有可能的是——一个员工有多个地址,还是一个地址有多个员工?如果是前者,那么你的外键关系就被颠倒了...... 感谢 delfuego 的评论。这只是我想出的一个简单的例子来展示这个问题。对于真正的生产系统,我同意这种关系可能会更复杂。可能会有一个关联表。 【参考方案1】: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));
【讨论】:
正在寻找这个。谢谢【参考方案2】:遇到类似的麻烦...@ChssPly76 答案工作正常,但如果外键不是父表中 Id 的一部分,则刚刚找到解决方案 - 您必须通过添加“referencedColumnName”来修改注释:
@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;
然后您可以创建条件:
criteria.add(restriction.eq("address.addrUniqueFieldName", 123);
【讨论】:
以上是关于Hibernate查询带有ID的外键字段的主要内容,如果未能解决你的问题,请参考以下文章
hibernate one-to-many 和 many-to-one
[解决方法]Hibernate查询部分字段(含外键)出错,报空指针异常