2

編集>私は行き止まりになっています...主な理由を探し続けることができます..たとえば、複数のeq制限がある多対多の関係の簡単な基準を作成する方法を教えてください。ここに示す例では、英語とドイツ語を話す人を取得します...

私の状況はこのようなものです。私は2つのクラスの人と言語を持っており、関係があります。そして私は検索を行うための基準を使用しています-元を話すすべての人を取得します。英語とドイツ語

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

面白いことに、1つの言語だけに設定すると、適切な人のリストが表示されますが、複数の言語には何も表示されないので、ベースを再確認して、2つの言語を話すように1人の人を特別に設定しました。しかし、何よりもヒントとなるのは、Set言語があるべき場所でのObject []の射影の結果、NULL値があるということです......

tnxを助けてください

4

1 に答える 1

1

非常に古いJDBCスタイル(JDBCは非常に古い人々がDBにアクセスするために使用したものです)で行っていることは、次のようになります。

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

(単なる例であり、正確にはSQLではありません)

また、このSQLを実行すると、LANGUAGE_ID=1およびLANGUAGE_ID=2の行がテーブルにないため、1行は返されません(非常に悲しい...)。

私はあなたの問題を解決するための最良の方法を本当に知りません(Hibernateは私の最強のスキルではありません)が、あなたの場合(言語数がそれほど大きくない場合)私は2つ(または3つ、またはループ)の選択をします次に、単純なSetinコードを使用して参加します。最善の解決策ではありません...そして誰かがより良い方法を示したら私は幸せになります

于 2010-09-17T12:52:07.153 に答える