[英]Dynamically create search criteria and results using Java and sql database
我目前正在使用Hibernate支持的基於Java的Web應用程序(JSF),該應用程序具有針對不同領域的多種不同搜索頁面。
搜索頁面包含一個搜索字段部分,用戶可以在其中自定義他們感興趣的搜索字段。可以添加一系列不同的搜索字段類型(確切的文本,以,開頭,包含,多選列表框,逗號分隔值等等)。 不需要填寫搜索字段並將其忽略,因為其他一些搜索字段需要其他搜索字段才能使該搜索字段具有值才能正常工作。
當前,我們針對每個區域使用特定於該區域的自定義搜索對象,並具有硬編碼的getter和setter搜索字段。
public interface Search {
SearchFieldType getSearchPropertyOne();
void setSearchPropertyOne(SearchFieldType searchPropertyOne);
AnotherSearchFieldType getSearchPropertyTwo();
void setSearchPropertyTwo(AnotherSearchFieldType searchPropertyTwo);
...
}
在此示例中,SearchFieldType和AnotherSearchFieldType表示不同的搜索類型,例如TextSearchField或NumericSearchField,其搜索類型分別為(大於,等於,大於等)或(大於,等於,小於等),以及具有他們可以輸入或保留為空(忽略搜索字段)。
我們使用此搜索對象來准備一個Criteria對象
搜索結果部分是一個表,用戶也可以對其進行自定義,以僅包含他們感興趣的結果對象的列。大多數列可以按升序或降序排列。
我們將結果支持在每個結果的Result對象中,該對象還對可以顯示的列進行了硬編碼。 該表由休眠注釋支持,但是我們嘗試使用平面數據,而不是允許其他休眠支持的對象最小化惰性連接數據。
@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);
...
}
搜索頁面由我們數據庫中的一個視圖支持,該視圖處理所有可能結果所需的所有表的聯接。 這種視圖已經變得非常龐大,即使用戶只想在一個字段上進行搜索並顯示幾列,每次搜索都會對性能造成巨大的影響,因為我們有多達三十個搜索字段選項和三十個不同的列可以顯示而所有這些都受到一個觀點的支持。
最重要的是,用戶一直希望將其添加到頁面中時請求新的搜索字段和列。 我們最終不得不更改搜索和結果對象以及支持視圖以進行這些更改。
我們正在嘗試調查此事,並找到替代方法。 提到的一種方法是創建不同的視圖,然后根據在結果表中搜索或顯示的字段來動態選擇這些視圖。 不同的視圖可能會連接到不同的列,因此我們選擇並選擇任何給定搜索所需的視圖。
我正在嘗試以另一種方式考慮問題。 我認為最好不要使用視圖,而是根據請求的搜索字段和結果列動態連接我們需要的表。 我還認為搜索和結果對象不應包含硬編碼的getter / setter,而應是搜索字段的集合和結果列的集合(或映射)。 我還沒有完全充實我的想法。
休眠仍然是解決此問題的有效方法嗎? 我不想創建在休眠條件中使用的Result對象,因為它們的結果列可以不同。 搜索字段和/或結果列都可能需要聯接表。
有沒有我可以使用的框架來幫助解決問題? 我一直在尋找東西,而我發現最接近的東西是SqlBuilder。
是否有人動態地解決過類似的問題?
如果解決方案已經存在,我希望不要重新發明輪子。
我很抱歉這最終變成了文字牆。 這是我的第一個stackoverflow帖子,我想確保我徹底定義了問題。
預先感謝您的回答!
我不完全了解這個問題。 但是JPA Criteria API似乎非常靈活,可以用於基於用戶提交的過濾條件來構建查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.