Проекция критериев Hibernate «многие ко многим»

РЕДАКТИРОВАТЬ> я в тупике... так что я могу продолжать искать основную причину.. Пожалуйста, скажите мне, как сделать простой критерий для отношений "многие ко многим", который имеет более одного ограничения eq, например, как получить человека, говорящего по-английски и по-немецки в примере, показанном здесь...

Моя ситуация такова: у меня есть два класса человек и языки с отношениями 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();

И самое смешное, что если я устанавливаю его только для одного языка, я получаю правильный список людей, но для более чем одного языка я не получаю ни одного, я перепроверил свою базу и специально установил одного человека, чтобы он говорил на двух языках. Но что мне больше всего подсказывает, так это то, что результат проекции в Object[] на место, где должны быть языки Set, имеет значение NULL......

пожалуйста, помогите tnx


person Darwly    schedule 13.09.2010    source источник


Ответы (1)


То, что вы делаете в очень старом стиле JDBC (JDBC - это то, что очень старые люди использовали для доступа к БД), будет примерно таким:

SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2

(просто пример, не совсем SQL)

И если вы запустите этот sql, он НИКОГДА не вернет ни одной строки (очень печально...), потому что в таблице нет строки с LANGUAGE_ID = 1 AND LANGUAGE_ID = 2.

Я действительно не знаю, как лучше всего решить вашу проблему (Hibernate не самый сильный мой навык), но в вашем случае (если количество языков не так велико) я бы сделал 2 (или 3, или цикл) выборки и присоединяйтесь, используя простой набор кода. Не лучшее решение... И я буду рад, если кто-то покажет лучший способ

person Plínio Pantaleão    schedule 17.09.2010
comment
я думал о том же, но я не был очень уверен, но основная проблема здесь заключается в том, как получить выбор из Set‹LANGUAGES›, потому что место Object[] всегда равно null в этом месте... - person Darwly; 18.09.2010