多目的基準の予測を冬眠します
-
02-10-2019 - |
質問
編集>私は行き止まりにいます...だから私は主な理由を探し続けることができます..例として、例として、複数のEQ制限を持つ多くの多くの関係に簡単な基準を作成する方法を教えてください。ここに示す例で、ENGとドイツ語を話す人を取得してください...
私の状況はこのようなものです。私は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人のspecifficalyを設定します。しかし、何よりも何よりも重要なのは、設定言語があるべき場所でのオブジェクトの投影の結果であり、ヌル値があるということです......
TNXを助けてください
解決
あなたが非常に古いJDBCスタイルでやっていること(JDBCは非常に古い人がDBにアクセスするために使用したものです)は次のようなものです:
SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2
(たとえば、正確にはSQLではありません)
そして、このSQLを実行した場合、それは単一の行を返すことはありません(非常に悲しい...) ライン Language_id = 1およびLanguage_id = 2のテーブルで。
私はあなたの問題を解決するための最良の方法を本当に知りません(Hibernateは私の最強のスキルではありません)が、あなたの場合(言語番号がそれほど大きくない場合)、私は2(または3、またはループ)の選択を作成しますそして、コードの単純なセットを使用して参加します。最良の解決策ではありません...そして誰かがより良い方法を示したら私は幸せになります
所属していません StackOverflow