Hibernate多对多关系查询

时间:2011-05-10 09:57:28

标签: java hibernate many-to-many

我有一个班级人员,每个人都可以拥有特定语言的文件。 Person和Document类与Many-To-Many关系链接。

我的Java代码如下所示:

@Table(name="person")
public class Person {
  @Id
  @Column(name="id")
  private Long id;

  @Column(name="name")
  private String name;

  @ManyToMany(targetEntity=Document.class)
  @JoinTable(name="person_document",
    joinColumns={
      @JoinColumn(name="person_id")
    },
    inverseJoinColumns={
      @JoinColumn(name="document_id")
    }
  )
  private List<Document> documents;

  // getter and setter ....
}

public class Document {
  @Id
  @Column(name="id")
  private Long id;

  @Column(name="language")
  private String language;

  // getter and setter ...
}

注意:我在这里使用Hibernate 3.

我想创建一个查询,让我只能用特定的语言回复所有人,比如说英语。

我的第一次尝试是遵循代码

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.createCriteria(Person.class)
  .createAlias("documents", "d")
  .add(Restrictions.eq("d.language", "english")
  .list();

此代码仅列出拥有英文文档的人员。我想要所有人,但每个人只需要英文文档。

例如:

  • 人A有英文文件X
  • B人有法文和英文文件(实际上是2份文件)
  • 人C有法文Z

我想列出:

  • 英文文件X的人A
  • 文件Y英文的人B
  • 没有文件的人A

这有意义吗?如果是这样,Hibernate查询如何查询就像。

由于这很难得到,我正在考虑这是错误的做法,但我不知道其他任何方法。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你应该查询反之亦然。这意味着您应该加载英文文档,并从文档对象中加载您可以获取的文档。

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.createCriteria(Documentn.class)
  .createAlias("documents", "d")
  .add(Restriction.eq("d.language", "english")
  .list();