2013-01-20 92 views
0

我想要搜索的內容在一個論壇上特別是論壇的問題Hibernate查詢要在論壇問題

例如搜索內容:

searchString = "Hibernate Session Configuration"; 

將給出問題的論壇相應的細節

但所有的單詞不必在論壇內容中連續,所以我將搜索字符串存儲在包含每個單詞的java.util.Set

String[] searchArray= searchString.toLowerCase().split(" "); 
Set<String> searchSet = new HashSet<String>(); 

// searchSet contains words of searchString 
for(String string : searchArray){ 
searchSet.add(string); 
} 

我寫Hibernate查詢,

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ForumQuestion.class); 

for(String searchUnitString : searchSet) 
{ 
detachedCriteria= detachedCriteria.add(Restrictions.disjunction().add(Restrictions.ilike("forumQuestion", "%"+searchUnitString+"%"))); 
} 
return template.findByCriteria(detachedCriteria); 

但此查詢工作不正常..它只是把最後Restrictions忽略以前Restrictions

在這個例子中,將考慮只爲「%配置%」,但我需要的是「%休眠%」或「%會話%」或「%Configuratoin%」一起

注:如果我查詢每個單詞,那麼數據庫命中將會很高

回答

1

你不添加分離。您要添加N個只包含一個限制的disjunctions。該代碼應該是:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ForumQuestion.class); 
Disjunction disjunction = Restrictions.disjunction(); 
for (String searchUnitString : searchSet) { 
    disjunction.add(Restrictions.ilike("forumQuestion", "%"+searchUnitString+"%")); 
} 
detachedCriteria.add(disjunction); 
return template.findByCriteria(detachedCriteria); 

需要注意的是,除非你在你的論壇上幾個問題,這些搜索將是緩慢的。 SQL查詢不是處理全文搜索的最佳方式。我會看Lucene(Hibernate Search使用,BTW)來完成這樣的任務。