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查询部分字段(含外键)出错,报空指针异常

如何使用主键作为JPA和Hibernate的外键引用?

Django:使用原始查询来限制 ModelForm 中的外键选择字段

查询关联表的外键

将查询集传递给 django 内联表单中的外键字段