【问题标题】:Hibernate query a foreign key field with IDHibernate查询带有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 的评论。这只是我想出的一个简单的例子来展示这个问题。对于真正的生产系统,我同意这种关系可能会更复杂。可能会有一个关联表。

标签: hibernate criteria


【解决方案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);

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2021-07-05
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多