2013-05-05 71 views
0

我一直在努力實現使用Hibernate標準進行搜索的功能。要求有點模糊。用戶可以在搜索字段中輸入任何文本/單詞,搜索必須通過多個表格進行,這些表格之間沒有任何關聯。休眠標準 - 從兩個表中獲取沒有任何關聯的結果

以下是兩個實體類。

Table A (EntityClassA.java) 
Table B (EntityClassB.java) 

如果用戶輸入應這兩個表中進行搜索,而應返回獲取列表(一個或多個)匹配輸入的字符(S)「anycharecter」。 此外我想將表A的結果存儲到列表,並將結果從表B到列表

我不知道這是如何實現使用休眠條件。

我只能設法寫一個表。

public List<EntityClassAVo> search((string keywords){ 

List<EntityClassAVo> outputList = new ArrayList<EntityClassVo>(); 

Criteria criteria = etSessionFactory().getCurrentSession().createCriteria(EntityClassA.class); 
//applying restriction - as I need to search entered string in all columns. 
criteria.add(Restrictions.ilike("id", keywords, MatchMode.ANYWHERE)); 
criteria.add(Restrictions.ilike("name", keywords, MatchMode.ANYWHERE)); 
criteria.add(Restrictions.ilike("age", keywords, MatchMode.ANYWHERE)); 
outputList = criteria.list(); 
return outputList; 
} 

問題

1)如果可能的話,如何寫EntityClassB.java標準在同一個 「搜索」 的方法? 2)如果問題1是可能的,如何將從EntityClassA獲取的結果存儲在一個對象中,並將EntityClassB存儲在另一個對象中? 3)如果上述不簡單,我可能會要求改變設計(只有當,如果我有很強的理由)。 - 我想在(表A)和(表B)之間放置一箇中間表(表X)。

[編輯] 4)有一種情況,用戶想要從1個表中的任何一個或兩個都搜索結果。我們將如何檢查這種情況?

請幫我解開這個東西。

回答

1

爲什麼不能簡單地爲EntityClassB編寫相同的標準?

Criteria criteriaA = etSessionFactory().getCurrentSession(). 
      createCriteria(EntityClassA.class); 
criteriaA.add(Restrictions.ilike("id", keywords, MatchMode.ANYWHERE)); 
criteriaA.add(Restrictions.ilike("name", keywords, MatchMode.ANYWHERE)); 
criteriaA.add(Restrictions.ilike("age", keywords, MatchMode.ANYWHERE)); 

Criteria criteriaB = etSessionFactory().getCurrentSession(). 
      createCriteria(EntityClassB.class); 
criteriaB.add(Restrictions.ilike("smth", keywords, MatchMode.ANYWHERE)); 
criteriaB.add(Restrictions.ilike("rows", keywords, MatchMode.ANYWHERE)); 
criteriaB.add(Restrictions.ilike("here", keywords, MatchMode.ANYWHERE)); 

,然後用,例如,地圖:實體 - >列表返回結果

map.put(EntityClassA.class, criteriaA.list()); 
map.put(EntityClassB.class, criteriaB.list()); 
return map; 
+0

感謝您的代碼,但我沒能獲得地圖的一部分。你能否稍微解釋一下,這裏Map的簽名是什麼? – Namita 2013-05-05 18:33:00

+0

Map的簽名可以是'Map ,列表<?如果你有一個基本的類EntityClassA和EntityClassB或者只是'Map ,List >',則擴展Entity >>。獲取數據:'EntityClassA a =(EntityClassA)search(「ololoolo」)。get(EntityClassA.class).get(0);' – Patison 2013-05-05 18:56:57

+0

好吧,那麼?運營商意味着「任何職業」。可以使用extends關鍵字來限定「擴展/實現實體類的任何類? – Namita 2013-05-05 19:13:59