【发布时间】: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 实例,这再次要求服务器代码提前了解查询的复杂性。
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 集成
【问题讨论】:
标签: spring spring-data spring-data-rest querydsl