从请求参数创建动态查询的简洁方法

时间:2013-08-21 17:35:25

标签: java spring java-ee spring-mvc

我使用的是Spring MVC 3.2,我使用JPA作为持久层。我想做以下事情:

当这样的请求到达/some-item?param1=something&param2=123&order-by=some-field时,我希望能够在持久层中自动构建查询,这样我就不必为getAllItemsWith(final String param1, final String param2...)创建十亿个方法,依此类推。

我已经想过在Map中捕获请求参数然后将其传递到存储库层,在那里我有一个预定义的params列表,我将检查它是否存在于地图中,如果它确实添加了necassaray条件。但是,我想知道是否还有其他更好的方法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的优雅方法。有这样的sql opeartor作为“coalese”(一些解释:http://www.1keydata.com/sql/sql-coalesce.html)。它允许传递任何参数进行查询,并确保忽略null个参数。

我的DAO接口示例(Spring data-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);

希望这有帮助

答案 1 :(得分:0)

使用偶数标准api很难做到。 你可以看看lucene Solr索引引擎,它主要用于涉及许多搜索条件的高级搜索目的。

答案 2 :(得分:0)

可能值得看Spring Data - JPA project。您仍然需要为所有params组合创建接口,但至少它们将自动实现。