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, или цикл) выборов и затем присоединитесь, используя простой набор в коде. Не лучшее решение... И я буду счастлив, если кто-то покажет лучший путь

Другие вопросы по тегам