Hibernate запрос отношения многие ко многим - PullRequest
1 голос
/ 10 мая 2011

У меня есть класс Person, и у каждого человека могут быть документы на определенном языке. Классы Person и Document связаны с отношением «многие ко многим».

Мой 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();

В этом коде перечислены только те люди, у которых есть документы на английском языке , но Я хочу, чтобы все лица, кроме документов на английском языке, получали каждого человека.

Например:

  • Лицо А имеет документ X на английском языке
  • Лицо B имеет документ Y на французском и английском языках (фактически 2 документа)
  • Лицо C имеет документ Z на французском языке

Я хочу попасть в список:

  • Лицо А с документом X на английском языке
  • Лицо B с документом Y на английском языке
  • Лицо А без документа

Это имеет смысл? И если да, то как будет выглядеть запрос Hibernate для такого запроса.

Поскольку это действительно трудно понять, я думаю, что это неправильный способ сделать это, но я не знаю другого способа сделать это.

Я ценю вашу помощь!

1 Ответ

2 голосов
/ 10 мая 2011

Вы должны запросить наоборот.Это означает, что вы должны загружать документы на английском языке, и из объектов этого документа вы можете получить людей.

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.createCriteria(Documentn.class)
  .createAlias("documents", "d")
  .add(Restriction.eq("d.language", "english")
  .list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...