2

EDIT> Я нахожусь в тупике ... поэтому я могу продолжить поиск основной причины .. Пожалуйста, расскажите мне, как сделать простой критерий для многих и многих отношений, которые имеют больше чем один эквалайзер, например, как привлечь человека, говорящего по русскому языку &, в примере, показанном здесь ...Спящий режим Многие из многих критериев Прогноз

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

@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 [] на том месте, где Установить языки должны быть, есть NULL значение ......

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

ответ

1

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

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

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

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

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

+0

Я думал об одном и том же, но я не был уверен, но главная проблема здесь в том, как получить выбор из набора , потому что Объект [] всегда имеет значение null на этом месте ... – Darwly

Смежные вопросы