[英]Hibernate Many-to-Many Criteria Projection
編輯>我處於死胡同...所以我可以繼續尋找主要原因。.請告訴我如何為具有多個等式限制的多對多關系建立簡單標准,例如,如何在下面顯示的示例中讓說英語和德語的人...
我的情況是這樣的,我有兩個班級的人和語言,並且有一個,.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();
有趣的是,如果我僅將其設置為一種語言,則會得到正確的人員列表,但是對於一種以上的語言,我將一無所獲,我會重新檢查自己的基礎並設置一個人專門說兩種語言。 但是,最重要的是,Object []在Set語言應該放置的地方的投影結果是NULL值……
請幫助tnx
您使用非常古老的JDBC樣式(JDBC是非常老人們用來訪問DB的東西)將是這樣的:
SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2
(僅是示例,並不完全是SQL)
而且,如果你運行該SQL它永遠不會返回一個單行(很傷心......),因為與LANGUAGE_ID = 1 AND LANGUAGE_ID = 2表中沒有任何行 。
我真的不知道解決您的問題的最佳方法(休眠不是我最強的技能),但是在您的情況下(如果語言數量不是那么大),我會選擇2個(或3個或一個循環)然后使用簡單的Set in代碼加入。 不是最好的解決方案...如果有人展示出更好的方法,我會很高興
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.