1

我正在使用 Spring MVC 3.2,并且我将 JPA 用于我的持久层。我想做以下事情:

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

我曾考虑在 a 中捕获请求参数,Map然后将其传递给存储库层,在其中我有一个预定义的参数列表,我将检查地图中是否存在,以及它是否添加了 necassaray 条件。但是,我想知道是否还有其他更好的方法可以做到这一点?

4

3 回答 3

1

I've found an elegant way to solve this problem. There is such sql opeartor as "coalese" (some explanations: http://www.1keydata.com/sql/sql-coalesce.html). It allows to pass any parameters to query and be sure that null parameters will be ignored.

Example of my DAO interface (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);

Hope this helps

于 2013-08-21T18:47:41.713 回答
0

可能值得一看Spring Data-JPA 项目。您仍然需要为所有参数组合创建接口,但至少它们会自动实现。

于 2013-08-21T18:00:31.170 回答
0

即使是标准 api,也很难做一些事情。你可以看看 lucene Solr 索引引擎,它主要用于涉及许多搜索条件的高级搜索目的。

于 2013-08-21T17:37:36.603 回答