美文网首页
spring boot JPA ,MVC 动态条件查询. RSQ

spring boot JPA ,MVC 动态条件查询. RSQ

作者: 大继 | 来源:发表于2019-01-07 19:07 被阅读0次

前言

  • 为了可以偷懒开发快速开发,和减轻和前端沟通,需要找到一个可以使用实体字段动态查询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"
  }
]

参考

相关文章

网友评论

      本文标题:spring boot JPA ,MVC 动态条件查询. RSQ

      本文链接:https://www.haomeiwen.com/subject/wkktrqtx.html