【发布时间】:2018-06-24 20:47:22
【问题描述】:
我想使用 REST 端点,将查询参数(qp1、qp2、qp3 的组合)传递给它,例如:
http://localhost:8080/..../my-rest-endpoint?qp1=abc or
http://localhost:8080/..../my-rest-endpoint?qp2=123 or
http://localhost:8080/..../my-rest-endpoint?qp1=abc&qp2=123 or
...
为此,我将 REST 端点定义为:
@GetMapping("/my-rest-endpoint")
public List<MyEntity> getMyEntities(WebRequest webrequest) {
Map<String, String[]> params = webrequest.getParameterMap();
String qp1 = params.containsKey("qp1") ? params.get("qp1")[0] : null;
Long qp2 = params.containsKey("qp2") ? Long.valueOf(params.get("qp2")[0]) : null;
String qp3 = params.containsKey("qp3") ? params.get("qp3")[0] : null;
List<WebfitVehicleContract> result = webfitVehicleContractRepository.findByQp1AndQp2AndQp3(qp1, qp2, qp3);
return result;
}
在JPA接口中的方法如下:
List<MyEntity> findByQp1AndQp2AndQp3(@Nullable String qp1, @Nullable Long qp2, @Nullable String qp3);
但是这种方法产生的结果看起来像是考虑了所有查询参数的查询生成: ... 其中 qp1 = ... AND qp2 = ... AND qp3 = ...
例如,如果我这样称呼它:
http://localhost:8080/..../my-rest-endpoint?qp2=123
看起来查询生成是: ...在哪里 qp1 = null AND qp2 = 123 AND qp3 = null
我想要实现的是,只有那些出现在 URL 调用中的查询参数,才应该构建那些查询。
如果呼叫仅使用 qp1 http://localhost:8080/..../my-rest-endpoint?qp1=abc
生成的查询应仅考虑 qp1 并导致 ...WHERE qp1 = 'abc'
这可以通过方法名称生成查询吗?也许有一些注释或类似的。 显然,我可以在 JPA 接口中为任何查询参数组合定义一个方法,但这种方法似乎不可行。使用 3 个查询参数,我必须定义 6 个方法,更多查询参数甚至更多。
而且我不想写普通的 SQL,想使用 Spring Data JPA 的特性。
干杯
【问题讨论】:
标签: spring-boot spring-data spring-data-jpa jpql