我创建了以下@RepositoryRestResource
查询,我想为其余的api创建动态查询。所以基本上我想做的事情是:
myHost/myApp/data/search/all?name=me&age=20&address=myhome&etc=etc
所以我在下面创建了查询:
@Query("Select t from Data t " +
"where " +
"t.name like :name AND " +
"t.age = :age AND " +
"t.address = :address AND " +
"t.etc= :etc"
@RestResource(path = "all", rel = "all")
Page findByAll(@Param("name") String name, @Param("age") String age,
@Param("address") String address, @Param("etc") String etc, Page page);
显然其中一些可能尚未输入。有没有办法在存储库中定义默认值?例如,我希望name
的默认值为%
。
我不完全确定这种方法对于我想要做的是正确的,所以欢迎任何其他建议。
答案 0 :(得分:7)
我知道这是旧的,但我遇到了类似的问题并按如下方式解决了这个问题:
@Query("Select t from Data t " +
"where " +
"(:name IS NULL or t.name like :name) AND " +
"(:age IS NULL or t.age = :age) AND " +
"(:address IS NULL or t.address = :address) AND " +
"(:etc IS NULL or t.etc= :etc)")
@RestResource(path = "all", rel = "all")
Page findByAll(@Param("name") String name, @Param("age") String age,
@Param("address") String address, @Param("etc") String etc, Page page);
答案 1 :(得分:1)
面对同样的问题,据我所知,解决这个问题的最佳方法是对每组值进行不同的查询。
答案 2 :(得分:1)
因此,一个可能的解决方案可能是您可能会转到控制器并使用@Controller
/ @RestController
@RequestParam
required = false
属性defaultValue = "%"
和{{1} }。
相应的调用可能如下所示:
@RestController
...
@RequestMapping(value = "[myCallFromFrontend]", method = RequestMethod.GET)
public ResponseItem getItemsByFilters (
@RequestParam(required = false, defaultValue = "%") String name,
@RequestParam(required = false, defaultValue = "%") String age,
@RequestParam(required = false, defaultValue = "%") String address,
@RequestParam(required = false, defaultValue = "%") String etc,
HttpServletResponse response){
ResponseItem item = null;
try {
//you might do this in service layer.
item = myRepository.findByAll(name, age, address, etc);
} catch (myException mE) {
log.error("...", mE);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
return item;
}
现在您已设置了默认值。但是,我不知道如何直接在存储库级别设置它们。我创建了一个关于该权利的问题here