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

Posted

技术标签:

【中文标题】Spring Data JPA - 使用 REST 调用上的查询参数从方法名称生成查询【英文标题】:Spring Data JPA - Query generation from method name using query parameters on REST call 【发布时间】: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 的特性。

干杯

【问题讨论】:

【参考方案1】:

由于您的参数可以为空,请将您的存储库方法更改为使用 Or 而不是 And

List<MyEntity> findByQp1OrQp2OrQp3(@Nullable String qp1, @Nullable Long qp2, @Nullable String qp3);

【讨论】:

这将适用于 null 情况,但如果指定了所有参数,则不会。我认为@neblaz 希望在这种情况下获得符合所有标准的结果 正确,我想减少给定参数的结果集,匹配它们,所以AND是正确的。 使用@Nullable 只是假设这是正确的方法。我想,如果一个参数为空,那么在查询生成中就不会考虑它,但不幸的是没有。

以上是关于Spring Data JPA - 使用 REST 调用上的查询参数从方法名称生成查询的主要内容,如果未能解决你的问题,请参考以下文章

在Spring Boot Data JPA Rest API中使用PostgreSql时,表未找到错误

构建RESTful服务(使用Spring Data JPA)

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

如何与 Spring Data REST 和 JPA 保持双向关系?

自定义查询 Spring Data JPA + REST

默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段