前言
-
为了可以
偷懒开发快速开发,和减轻和前端沟通,需要找到一个可以使用实体字段动态查询jpa,并输出到mvc给前端对接后台管理界面。 -
我看了三天三夜文档,从elasticsearch ,graphsql jpa Criteria ,到 JPA specification再到specificationBuilder...
, -
看了这么都东西后自己实现了一套Query language.
//随便看看就好
穷举查询情况
/users?
1. 查询id等于或name like 或 手机号like
search=id:106|name~106|mobile~106
2.查询 16~18岁叫 lucy 的妞
search=sex:妞,age>16,age<18
3.查询订单状态等于SUCCESS,CANCEL ,summary like 买了个并
orders?search=(status:SUCCESS|status:CANCEL),name~买了个并
4,双重条件
search=((user.roles:admin|roles:tester),name~大吉)|((user.roles:admin2|roles:tester2),name~大吉)
RSQL 不搞这个了
5,starwith
search=role:ROLE_%
开始感觉自我良好。这次有个可以开源的组件了。
- 和前端
吵了两天商讨了两天,主要问题还是在不好转义成URL。之后继续查看了. RSQL, FIQL等文件。我觉得还是用标准的东西好,所以开始我的RSQL之旅。
重点
- 需要简单并满足90%的查询需求,不需要一直写代码。
RSQL
- 全称RestFull Query Language.
- 就是一个可以满足我重点要求的技术标准。
- 问题:没有大厂家实现,只能用野鸡的了,怎么都好过自己写。
开始
<dependency>
<groupId>cz.jirutka.rsql</groupId>
<artifactId>rsql-parser</artifactId>
<version>2.1.0</version>
</dependency>
//Repository 加入JpaSpecificationExecutor
public interface ArticleRepository extends JpaRepository<Article,String >,JpaSpecificationExecutor<Article> {
//使用
articleRepository.findAll(specification,pageable).getContent();
//添加到RestController
@GetMapping(value = "/users", produces = "application/json; charset=utf-8")
public List<User> search(@RequestParam(value = "search",required = false) String search,
@RequestParam(required = false,defaultValue = "0") Integer page,
@RequestParam(required = false,defaultValue = "20") Integer size) {
List<User> users = null;
Pageable pageable = PageRequest.of(page,size,Sort.by(
new Sort.Order(Sort.Direction.DESC, "createTime")));
if(StringUtils.isEmpty(search)){
users = userService.findAll(pageable);
}else {
Node rootNode = new RSQLParser().parse(search);
Specification<User> spec = rootNode.accept(new CustomRsqlVisitor<User>());
users = userService.findAll(spec,pageable);
}
return users;
}
RSQL语法
-
RSQL expression is composed of one or more comparisons, related to each other with logical operators:
-
Logical AND : ; or and
-
Logical OR : , or or
-
Equal to : ==
-
Not equal to : !=
-
Less than : =lt= or <
-
Less than or equal to : =le= or ⇐å
-
Greater than operator : =gt= or >
-
Greater than or equal to : =ge= or >=
-
In : =in=
-
Not in : =out=
测试
/users?search=id==1
[
{
"id": 1,
"image": null,
"name": "admin",
"signature": null,
"sex": null,
"updateTime": "2019-01-05 16:15:54",
"createTime": "2019-01-05 16:15:54"
}
]
网友评论