Hibernate проекция критериев "многие ко многим"
РЕДАКТИРОВАТЬ> Я зашел в тупик... так что я могу продолжать искать основную причину.. Пожалуйста, скажите мне, как сделать простые критерии для многих ко многим отношениям, которые имеют более одного ограничения eq, например, как получить человека, говорящего на английском и немецком языках в примере, показанном здесь...
Моя ситуация такова, что у меня есть два класса человек и языки, с отношениями, м... И я использую критерии для поиска - получить всех людей, которые говорят на бывшем. Английский и немецкий
@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();
И забавно то, что если я установил его только для одного языка, я получил правильный список людей, но для более чем одного языка я не получил ни одного, я перепроверил свою базу и специально назначил одного человека, чтобы он говорил на двух языках. Но что больше всего подсказывает, так это то, что в результате проецирования в Object[] на место, где должны находиться языки Set, есть значение NULL......
пожалуйста, помогите 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, или цикл) выборов и затем присоединитесь, используя простой набор в коде. Не лучшее решение... И я буду счастлив, если кто-то покажет лучший путь