2012-04-26 126 views
6

在我的一個應用程序中,我將執行多個字段/列的搜索。它是一個高級搜索,有超過20個字段可供用戶搜索結果。例如,用戶可以搜索基於高級搜索使用Hibernate搜索

  1. 預定ID
  2. 旅客姓名
  3. 乘客年齡
  4. 出發地點
  5. 要位置
  6. 訂單管理
  7. 的名稱預訂航空公司

和13個這樣的字段。

我想如果

  1. Hibernate Search的找出可以而且應該在這裏使用?如果是這樣,怎麼樣?我無法找到使用Hibernate Search進行如此複雜搜索的示例。

  2. 而不是Hibernate搜索,我可以簡單地使用Hibernate,也許設計一個多線程搜索取決於參數的數量。這是個好主意嗎?

  3. 這裏可以使用Hibernate Filters嗎?

有人可以提供輸入或參考鏈接嗎?

+0

您是否期望用戶將自己的搜索條件輸入到一個字段中,然後針對多個列進行測試?或爲每列分開搜索字段? – 2012-05-20 21:57:31

+0

其每個列的單獨字段。 – 2012-05-21 03:12:35

回答

2

對於這些類型的查詢,我通常使用帶有表單對象的Criteria查詢。然後在每個傳遞的表單字段中檢查null,如果不是null,則使用該字段將另一個Restriction添加到查詢中。使用Criteria查詢可以保持Java代碼非常乾淨並消除混亂的字符串連接。一個例子爲您的情況:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

嗨@Aaron,謝謝你的回覆。我的問題是數據分佈在大約25個表格中。所以說如果我使用Criteria,這將是一個與Joins的巨大聲明。這是我想避免有一個乾淨的實現。如果我有5-6個字段可供搜索,你所提出的建議完美無缺。 – 2012-04-27 04:46:07

+0

如果你有Hibernate實體建立關係,那麼Hibernate會爲你處理所有這些連接,並且你將能夠在這些其他表上使用上述策略。在Hibernate中思考,而不是SQL,讓工具爲你做好工作。 – atrain 2012-04-27 12:42:40

+0

我不確定我是否正確理解你。讓我舉一個例子,我要搜索「旅行類型」是「單行」的「預訂」。旅行類型嵌入在「預訂」類以下6級的類中。所以我實際上必須搜索旅行類型而不是預訂類。現在可以有20個這樣的參數,我將在其中搜索哪些從Booking類的各個級別嵌入。如果我必須使用標準來做到這一點,那麼我將不得不加入所有這些級別的表格,我認爲這些表格非常麻煩。 – 2012-04-27 17:40:59

0

是的,Hibernate搜索將在這種情況下非常有用。你可以使用過濾器,但Hibernate Search也有過濾器。

2

我認爲你的決定應該基於容量的要求。 普通的Hibernate查詢可能足以在這些許多字段上進行搜索。

如果您想使用反向索引快速獲取大量數據的搜索查詢,Hibernate Search將會有所幫助。例如,您應該做的就是在未來5年內用您期望的容量加載數據庫。如果你的普通Hibernate查詢被認爲是可以接受的,我想你應該堅持使用普通的Hibernate查詢。

您也可以在稍後的階段介紹Hibernate搜索。

編輯: 您可以選擇不使用Hibernte搜索,下降到較低的級別,而是使用Apache Lucene。你可以生成你自己的Apache Lucene索引。這樣您就不必擔心爲了查找記錄而使用哪個字段,因爲您將完全控制標記化和索引過程。 如果您選擇這種方式,您可以將行名和列名存儲爲搜索結果的一部分。

+0

感謝您的回覆@Daniel。這裏我關心的是爲了生成查詢而必須寫入的複雜代碼的數量。我從超過25張表中搜索,需要手動寫入的連接數量非常容易出錯。 – 2012-05-24 19:25:42

+0

擔心複雜的代碼?向下一級到Apache Lucene。您不必創建Hibernate查詢,而是查詢您自己創建的Lucene索引。唯一的缺點是你需要了解底層的Lucene技術。 – 2012-10-04 13:45:06