Гибернация проекции критериев "многие ко многим"
EDIT> я в тупике... так что я могу продолжать искать главную причину .. Пожалуйста, скажите мне, как сделать простой критерий для многих ко многим отношениям, который имеет более чем одно ограничение эквалайзера, например, как получить человека, говорящего на английском и немецком языках в примере, показанном здесь...
Моя ситуация такова: у меня есть два класса человек и языки, с отношениями n, m.. И я использую критерии, чтобы сделать поиск-получить все лица, которые говорят ex. Английский язык и Немецкий
@Entity
public class Person implements Serializable {
private int id;
...........
private Set<Languages> languages = new HashSet<Languages>();
...............
@ManyToMany
@JoinTable(name = "link_person_languages")
public Set<Languages> getLanguages() {
return languages;
}
}
@Entity
public class Languages implements Serializable {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(nullable = false, length = 40, unique = true)
public String getName() {
return name;
}
Критерии
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("languages"));
c = enumMap.get(attr);
if (c.isChanged()) {
Criteria crit2 = crit.createCriteria("languages");
Object[] o = (Object[]) c.getAnswer();
Conjunction con = Restrictions.conjunction();
for (int j = 0; j < o.length; j++) {
Criterion tmp = Restrictions.eq("id", ((Languages)o[j]).getId());
con.add(tmp);
}
crit2.add(con);
}
crit.setProjection(projList);
retList = crit.list();
И самое смешное, если я установлю его только для одного языка, я получу правильный список людей, но для более чем одного языка я не получу ни одного, я перепроверил свою базу и установил одного человека специально, чтобы говорить на двух языках. Но что подсказывает mi больше всего, так это то, что результат проекции в объекте [] на то место, где должны быть заданные языки, есть нулевое значение......
Пожалуйста, помогите tnx
1 ответ:
То, что вы делаете в очень старом стиле JDBC (JDBC-это то, что очень старые люди использовали для доступа к БД), будет примерно так:
SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2
(просто пример, не совсем SQL)
И, если вы запустите этот sql, он никогда не вернет ни одной строки (очень грустно...) потому что в таблице нет строки С LANGUAGE_ID = 1 и LANGUAGE_ID = 2.
Я действительно не знаю лучшего способа решить вашу проблему (Hibernate-не самый сильный мой навык), но в вашем случае (если языки число не так уж и велико) я бы сделал 2 (или 3, или цикл) выборки и объединил их, используя простой набор в коде. Не самое лучшее решение... И я буду счастлив, если кто-то покажет лучший путь