У меня есть класс 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 для такого запроса.
Поскольку это действительно трудно понять, я думаю, что это неправильный способ сделать это, но я не знаю другого способа сделать это.
Я ценю вашу помощь!