需求
- 通用查询语言,可在REST API的GET请求中用于过滤返回的资源集合
- 通过“标准”查询语言传递查询,并作为请求参数通过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")
我调查了四种解决方案-每个方案都更接近目标。是否有其他解决方案我没有找到,或者没有这样完整的开箱即用的解决方案-答案是基于下面概述的“REST查询语言与RSQL”构建吗?
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 - "构建一个REST查询语言"
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 Integration