是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言

Posted

技术标签:

【中文标题】是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言【英文标题】:Is there a generic REST query language for JPA, spring-data, spring-data-rest 【发布时间】:2018-10-20 18:16:36 【问题描述】:

要求

通用查询语言,可用于 GET 请求以收集 REST api 中的资源以过滤返回的资源集 通过“标准”查询语言传入并通过 HTTP 作为请求参数发送的查询 - 例如 /someresource?query=...... 或 /someresource?a.b.c=2 在服务器上运行时构造的 SQL 查询 与 jpa、spring-data、spring-data-rest 紧密集成 - 代码越少越好。 可用于查询的嵌套资源和属性路径 支持复杂的操作数 - EQUALS、GREATER_THAN、LESS_THAN、NEGATION、LIKE、AND、OR、NOT、IN

例如 resourceA.attribute1 = "CAT" AND resourceA.subResourceB.attribute2 >= 42 AND resourceA.attribute3 IN ("WHIZ","BANG")

我研究了四种解决方案,每一种都更接近目标。是否有其他一些我还没有找到的解决方案,或者没有开箱即用的完整解决方案 - 是建立在下面概述的“使用 RSQL 的 REST 查询语言”之上的答案吗?

1) spring-data-rest 查询

spring data 中有很多支持在代码中开发复杂查询,但这需要开发人员事先了解查询的结构并相应地构造代码。 https://docs.spring.io/spring-data/rest/docs/current/reference/html/#repository-resources.query-method-resource

2) spring-data、spring-data-rest、query-dsl

http://www.baeldung.com/rest-api-search-querydsl-web-in-spring-data-jpa

+ve 非常适合 - 功能强大的解决方案,开箱即用几乎为零编码

+ve 可以构建深度嵌套的查询,服务器即时生成正确的 SQL。

-ve 唯一的运算符是 EQUALS '=' 为了应用额外的运算符,您需要实现 QuerydslBinderCustomizer 实例,这再次要求服务器代码提前了解查询的复杂性。

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/querydsl/binding/QuerydslBinderCustomizer.html

3) Baeldung - “构建一个休息查询语言”

http://www.baeldung.com/spring-rest-api-query-search-language-tutorial

基本操作(EQUALS、GREATER_THAN、LESS_THAN)http://www.baeldung.com/rest-api-search-language-spring-data-querydsl 高级操作((EQUALS、GREATER_THAN、LESS_THAN、NEGATION、LIKE) http://www.baeldung.com/rest-api-query-search-language-more-operations OR 运算符 http://www.baeldung.com/rest-api-query-search-or-operation

+ve - 更接近通用查询语言

-ve - 感觉就像一个演示/POC

4) 带有 RSQL 的 REST 查询语言

http://www.baeldung.com/rest-api-search-language-rsql-fiql

+ve - 感觉像是一个更完整的查询语言和相关的解析器

-ve - 不确定 spring 集成

【问题讨论】:

【参考方案1】:

JPA 没有通用的 REST 查询语言。您所确定的似乎就是那里的东西,但是 querydsl 和 rsql 上最近的活动很少表明您在采用它们时应该小心。您很可能必须自己通过分叉项目来支持其他更改,尤其是在 5 年后,作者肯定会转向其他事情。

其他一些有趣的链接:

5) 使用注解动态构建查询

https://blog.tratif.com/2017/11/23/effective-restful-search-api-in-spring 通过 Spring 的参数解析器将控制器方法上的注释映射到 JPA 标准规范 将 SQL 概念(如连接)放在 Web 控制器中,这会泄露抽象 应在服务级别而非控制器级别实施

【讨论】:

以上是关于是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言的主要内容,如果未能解决你的问题,请参考以下文章

即使 JPA 实体不脏,我是不是可以强制 spring-data 更新可审计字段?

jpa AttributeConverter 是不是适用于查询子句?

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

具有多租户休眠的 Spring-Data JPA

春季数据替代品

Spring-Data JPA:保存引用现有实体的新实体