我使用的是Spring MVC 3.2,我使用JPA作为持久层。我想做以下事情:
当这样的请求到达/some-item?param1=something¶m2=123&order-by=some-field
时,我希望能够在持久层中自动构建查询,这样我就不必为getAllItemsWith(final String param1, final String param2...)
创建十亿个方法,依此类推。
我已经想过在Map
中捕获请求参数然后将其传递到存储库层,在那里我有一个预定义的params列表,我将检查它是否存在于地图中,如果它确实添加了necassaray条件。但是,我想知道是否还有其他更好的方法可以做到这一点?
答案 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组合创建接口,但至少它们将自动实现。