2013-08-21 39 views
1

我使用Spring MVC 3.2,並使用JPA作爲我的持久層。我想要做到以下幾點:從請求參數創建動態查詢的簡潔方法

當這樣的請求到達/some-item?param1=something&param2=123&order-by=some-field我希望能夠在持久層自動生成一個查詢,這樣我就不必爲getAllItemsWith(final String param1, final String param2...)等創建十億個方法。

我曾想過在Map中捕獲請求參數,然後將其傳遞到存儲庫層,我有一個預定義的參數列表,我將檢查映射中是否存在以及是否添加了necassaray條件。但是,我想知道是否有其他更好的方法來做到這一點?

+0

像這樣的問題,只是提出了4個問題倒在'Java'。你提出的方式可能是最簡單的。但是,您可能會泄露您網站中的專欄名稱。 –

回答

0

即使是標準API也很難做到。 您可以看看lucene Solr索引引擎,它主要用於涉及許多搜索條件的高級搜索目的。

1

我發現了一個優雅的方法來解決這個問題。有像「coalese」這樣的sql操作符(一些解釋:http://www.1keydata.com/sql/sql-coalesce.html)。它允許傳遞任何參數進行查詢,並確保null參數將被忽略。我的DAO接口的

例(春季數據JPA,MySQL的):

@Query("select b from Book b where " + 
       "coalesce(b.name, '') like concat('%', :name, '%') " + 
       "and coalesce(b.author, '') like concat('%', :author, '%') " + 
       "and coalesce(b.category, '') like concat('%', :category, '%') " + 
       "and coalesce(b.publisher, '') like concat('%', :publisher, '%') " + 
       "and (b.available = :available1 or b.available = :available2)") 
    public Page<Book> findByParams(
       @Param("name") String name 
       , @Param("author") String author 
       , @Param("category") String category 
       , @Param("publisher") String publisher 
       , @Param("available1") Boolean available1, @Param("available2") Boolean available2 
       , Pageable pageReq); 

希望這有助於