Spring Data JPA仓库:是否可以为参数设置默认值/全部默认?

8
所以,简而言之:在Spring Data JPA(可能是@Query-Annotated)Repository方法中是否可以将参数设置为“default: All”或更一般的默认特定值?
知道在(Rest)控制器中设置默认值是可能的,但我只是好奇是否也可以在Repository级别进行此操作。我认为这可能是一个不错的功能,“获取一些经过筛选的结果集,其中前端可能没有通过rest调用设置筛选器”是一个非常常见的用例。
示例查询:
@Query("select new com.my.dto(e.name, e.age, e.address)" +
        " from Entity e" +
        "where e.name like ?1 " +
        "and e.age like ?2  " +
        "and e.street like ?3")
List<Item> findItemsFiltered(String name, String age, String street);

所以,假设未设置街道,存储库应使用“%”返回所有结果,其中其他条件匹配但街道不相关。

2
我认为那样会变得很混乱。相反,你最好使用一个“规范(Specification)”来构建动态查询(这基本上就是你想要的)。另请参阅http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/。 - M. Deinum
您可能也想检查参考指南 -> http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications - M. Deinum
1
听起来是一个可行的解决方案,到目前为止谢谢 :) 我只是想到特别是常见的用例“如果没有定义值,则回退到选择所有内容”,可能会有一种更“容易的方法来做到这一点”。在这里有些简单的东西将是很棒的,考虑到其他查询具有过滤值列表,如where e.group IN ?3(这里不能使用“%”)。但是,到目前为止还不错。如果您愿意,请从您的评论中创建一个答案。我仍然会等待其他答案,但正如所说,这是一个可行的解决方案 :-) - Dominik
1个回答

0

@Query 本身中进行如何? 类似于:

@Query("select new com.my.dto(e.name, e.age, e.address)" +
    " from Entity e" +
    "where e.name like ?1 " +
    "and e.age like ?2  " +
    "and e.street like (CASE WHEN ?3 IS NULL THEN '%' ELSE ?3 END)")
List<Item> findItemsFiltered(String name, String age, String street);

另一种方法是使用自定义参数注释,例如@Default,但我认为这将需要自定义存储库实现。

另一种选择是像M. Deinum提到的那样使用Specification


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接