2012-05-03 62 views
0

我目前正在使用基於Java的Web應用程序(JSF),它由Hibernate支持,它具有各種不同區域的不同搜索頁面。使用Java和sql數據庫動態創建搜索條件和結果

搜索頁面包含一個搜索字段部分,用戶可以自定義他們感興趣的搜索字段。可以添加一系列不同的搜索字段類型(確切文本,開始於,包含,多個 - 選擇列表框,逗號分隔值等等)。搜索字段不需要填寫並被忽略,其他搜索字段需要不同的搜索字段才能使該搜索字段有效。

我們目前在每個區域使用一個特定於該區域的自定義搜索對象,並具有硬編碼的getter和setter搜索字段。

public interface Search { 
    SearchFieldType getSearchPropertyOne(); 
    void setSearchPropertyOne(SearchFieldType searchPropertyOne); 

    AnotherSearchFieldType getSearchPropertyTwo(); 
    void setSearchPropertyTwo(AnotherSearchFieldType searchPropertyTwo); 

    ... 
} 

在這個例子中,SearchFieldType和AnotherSearchFieldType代表不同類型的搜索像TextSearchField或具有搜索類型的NumericSearchField(起始爲,包含等)或(大於,等於小於等)以及他們可以進入或退出的搜索值(忽略搜索字段)。

我們使用這個搜索對象準備一個Criteria對象

搜索結果部分是,也可以由用戶自定義爲包含他們感興趣的結果對象僅列的表。大多數列可按順序升序或降序。

我們將結果返回到每個結果的Result對象中,該結果也對可以顯示的列進行硬編碼。該表由hibernate註釋支持,但我們試圖使用平面數據,而不是允許其他支持hibernate的對象最小化延遲加入數據。

@Entity(table = "result_view") 
public interface Result { 
    @Column(name = "result_field_one") 
    Long getResultFieldOne(); 
    void setResultFieldOne(Long resultFieldOne); 

    @Column(name = "result_field_two") 
    String getResultFieldTwo(); 
    void setResultFieldTwo(String resultFieldTwo); 

    ... 
} 

搜索頁面是由我們的數據庫中查看它處理加入到所需要的每一個可能的結果的所有表支持。這種觀點已經變得非常龐大,即使用戶只想在一個領域進行搜索並顯示幾列,因爲我們有超過30個搜索字段選項和30個不同的列可以顯示這一切都得到了一個觀點的支持。

最重要的是,用戶一直請求新的搜索字段和列,他們想要添加到頁面中。我們最終不得不改變搜索和結果對象以及後臺視圖來進行這些更改。

我們正試圖調查此事並找到替代方案。提到的一種方法是創建不同的視圖,我們根據在結果表中搜索或顯示的字段來動態選擇。不同的視圖可能會加入不同的列,我們選擇和選擇我們需要的任何給定搜索的視圖。

我試圖以不同的方式思考問題。我認爲最好不要使用視圖,而是根據請求的搜索字段和結果列動態連接我們需要的表。我也覺得搜索和結果對象不應該包含硬編碼的getter/setter,而應該是搜索字段和結果列的集合(或映射)的集合。我還沒有完全充實我的想法。

休眠仍然是這個問題的有效解決方案?我不想創建一個在hibernate條件中使用的Result對象,因爲它們的結果列可能不同。搜索字段和/或結果列都可能需要連接表。

有沒有我可以使用的框架可能有助於解決問題?我一直在尋找一些東西,而我發現的最接近的東西是SqlBuilder。

有沒有其他人動態地解決了類似的問題?

如果解決方案已經存在,我寧願不重新發明輪子。

我很抱歉,這最終成爲文字牆。這是我的第一個stackoverflow帖子,我想確保我徹底定義了我的問題。

在此先感謝您的答案!

回答

0

我不完全理解這個問題。但是JPA Criteria API看起來非常靈活,可以根據用戶提交的過濾條件構建查詢。