我目前正在为教学目的制作一个Spring Boot REST API项目,其中有一个包含22个列的相当大的表格已经被加载到了MySQL数据库中,并且我正在努力让用户有能力通过多个列(例如6个)过滤结果。
我目前正在扩展一个Repository,并初始化了一些方法,例如findByParam1和findByParam2和findByParam1OrderByParam2Desc等,并验证它们按照预期工作。我的问题是,最好的方法是允许用户在不编写大量条件/存储库方法变体的情况下利用所有6个可选的RequestParams。例如,我希望用户有能力击中url home/get-data/来获取所有结果,home/get-data?param1=xx来基于param1进行过滤,并且潜在地,home/get-data?param1=xx¶m2=yy...¶m6=zz来过滤所有可选参数。
供参考,这里是我的控制器的相关代码(大致上)。
@RequestMapping(value = "/get-data", method = RequestMethod.GET)
public List<SomeEntity> getData(@RequestParam Map<String, String> params) {
String p1 = params.get("param1");
if(p1 != null) {
return this.someRepository.findByParam1(p1);
}
return this.someRepository.findAll();
}
到目前为止,我的问题是,按照我目前的处理方式,我将需要n!个方法来支持筛选功能,其中n等于我想要进行筛选的字段/列的数量。是否有更好的方法来处理这个问题,也许是在原地过滤存储库,以便我可以简单地在检查Map时过滤“原地”,看看用户确实填充了哪些过滤器?
编辑:所以我目前正在实施一个“hacky”解决方案,可能与J. West下面的评论有关。我假设用户将在请求URL中指定所有n个参数,如果他们没有(例如,他们指定p1-p4但不是p5和p6),我将生成SQL语句,只匹配非包含参数的LIKE'%'。它看起来像...
@Query("select u from User u where u.p1 = :p1 and u.p2 = :p2 ... and u.p6 = :p6")
List<User> findWithComplicatedQueryAndSuch;
在控制器中,我会检测Map中的p5和p6是否为null,如果是,就将它们简单地更改为字符串“%”。我相信有一种更精确和直观的方法来做到这一点,尽管我还没有找到类似的东西。
null
。由于你正在映射一个对象,即使你按照正确的方式做了这个操作,查询中没有返回的字段也将为空。 - Trevor ByeJpaSpecificationExecutor
的链接,它似乎是正确的方向。http://www.cubrid.org/wiki_ngrinder/entry/how-to-create-dynamic-queries-in-springdata - Trevor Bye