我想使用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并导致 ......在哪里qp1 =&#39; abc&#39;
从方法名称生成查询是否可以实现?也许有一些注释或类似的。 显然,我可以在JPA接口中为查询参数的任何组合定义一个方法,但这种方法似乎不可行。使用3个查询参数,我必须定义6个方法,查询参数更多。
而且我不想编写纯SQL,想要使用Spring Data JPA的功能。
干杯
答案 0 :(得分:0)
由于您的参数可以为空,因此请将您的存储库方法更改为In [23]: list(find_key(mydict))
Out[23]: ['e', 'c.d']
In [26]: mydict = {'a' : 'apple',
'b' : 'bobb',
'c' : {
'd' : 'dog'
},
'e' : 'dog',
'k':{'f':{'c':{'x':'dog'}}}}
In [27]:
In [27]: list(find_key(mydict))
Out[27]: ['k.f.c.x', 'e', 'c.d']
而不是Or
And