Hibernate проекция критерия «многие ко многим» - PullRequest
2 голосов
/ 13 сентября 2010

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

У меня такая ситуация: у меня два класса человек и язык с отношениями n, m ... И я использую критерии для поиска - найдите всех людей, которые говорят на бывшем. Английский и немецкий

@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();

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

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

1 Ответ

1 голос
/ 17 сентября 2010

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

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

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

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

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

...