Spring Data JPA - 使用REST调用上的查询参数从方法名称生成查询

时间:2018-01-16 07:44:38

标签: spring-boot spring-data spring-data-jpa jpql

我想使用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的功能。

干杯

1 个答案:

答案 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