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

前言

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

参考

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,164评论 0 10
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,163评论 0 13
  • 新年快乐~ 元旦快乐~ 2016年,你好,在接下来的366天里,希望我们能好好相处~ 每一天,不管喜乐悲苦,我都会...
    三水沐辰阅读 1,644评论 0 0
  • 每日复盘 Objective 你对今天学的记得什么? 巩固了小龙老师教的知识! Reflective 一句话形容今...
    她念阅读 988评论 0 0
  • 1.思维笔的空性 今天再次看到师兄发的朋友圈,我的心情为之一振,我好希望我的伴侣可以是这样智慧的人,内心冒出来一些...
    柔光宝宝阅读 1,300评论 0 0