当前位置: 首页 > news >正文

[case10]使用RSQL实现端到端的动态查询

本文主要研究一下如何使用RSQL实现从前端到后端的动态数据查询。

RSQL

RSQL(RESTful Service Query Language)是Feed Item Query Language (FIQL) 的超集,是一种RESTful服务的查询语言。这里我们使用rsql-jpa来实践,它依赖rsql-parser来解析RSQL语法,然后将解析后的RSQL转义到JPA的Specification。

maven

<dependency>
    <groupId>com.github.tennaito</groupId>
    <artifactId>rsql-jpa</artifactId>
    <version>2.0.2</version>
</dependency>
它依赖了rsql-parser

实例

domain

@Entity
public class TodoTask {

    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long totalNum = 0L;

    private String title;

    @Version
    private Long version;

    //...
}    

controller

@RestController
@RequestMapping("/rsql")
public class RsqlController {

    @Autowired
    TodoTaskService todoTaskService;

    /**
     * @param condition
     * @param page
     * @param size
     * @return
     */
    @GetMapping("")
    public Page<TodoTask> query(@RequestParam String condition,
                                @RequestParam(required = false,defaultValue = "0") int page,
                                @RequestParam(required = false,defaultValue = "20") int size){
        return todoTaskService.query(condition,new PageRequest(page,size));
    }
}

service

@Component
public class TodoTaskService {

    @Autowired
    private EntityManager entityManager;

    public Page<TodoTask> query(String condition, Pageable pageable){
        // 1.Create the JPA Visitor
        RSQLVisitor<CriteriaQuery<TodoTask>, EntityManager> visitor = new JpaCriteriaQueryVisitor<TodoTask>();
        // 2.Parse a RSQL into a Node
        Node rootNode = new RSQLParser().parse(condition);
        // 3.Create CriteriaQuery
        CriteriaQuery<TodoTask> criteriaQuery = rootNode.accept(visitor, entityManager);
        List<TodoTask> total = entityManager.createQuery(criteriaQuery).getResultList();
        List<TodoTask> resultList = entityManager.createQuery(criteriaQuery)
                .setFirstResult(pageable.getOffset()).setMaxResults(pageable.getPageSize()).getResultList();

        return new PageImpl<>(resultList,pageable, total.size());
    }
}
这里直接使用EntityManager来查询,总共分三步,1是创建RSQLVisitor,2是解析condition到Node,3是根据node创建CriteriaQuery,然后就可以根据CriteriaQuery来查询了。

运行

curl -i http://localhost:8080/rsql?condition=title==hello
curl -i http://localhost:8080/rsql?condition=totalNum%3E50
curl -i http://localhost:8080/rsql?condition=totalNum%3E50;title==hello
其中%3E是>的url转义,如果有多个and条件,用;分隔

小结

RSQL是一种强大抽象的语言,可以用来做REST服务的通用查询语言,spring-data-rest也提供了类似的功能,功能更为强大。不过这种貌似不支持or查询,另外数据量大的时候,直接走db查询可能造成慢查询,因为并不是所有字段都有索引,不过对于走elasticsearch来说,还是比较合适的。

doc

  • FIQL: The Feed Item Query Language
  • REST Query Language with RSQL
  • rsql-jpa
  • rsql-parser
  • Using the Criteria API to Create Queries

相关文章:

  • webpack4入门
  • SSM-Spring-17:Spring中aspectJ注解版
  • 前端Sass回顾以及Compass入门小记
  • ArchSummit2018深圳站筹备中,18大专题征集演讲嘉宾
  • Netty(十八)(中级篇)心跳连接
  • Android7.0以后跨应用
  • 手机零部件下半年持续缺货 供应商涨价趋势加剧
  • 1005. 继续(3n+1)猜想 (25)
  • [UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库
  • 微服务的4个设计原则和19个解决方案
  • 阿里云Redis开发规范
  • SEMI-PARAMETRIC TOPOLOGICAL MEMORY FOR NAVIGATION
  • StringUtils方法
  • java自定义注解
  • 排序算法之--选择排序
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • @jsonView过滤属性
  • Android Volley源码解析
  •  D - 粉碎叛乱F - 其他起义
  • JavaScript HTML DOM
  • js继承的实现方法
  • JS专题之继承
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux gpio口使用方法
  • Meteor的表单提交:Form
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • vue 配置sass、scss全局变量
  • Zepto.js源码学习之二
  • 百度小程序遇到的问题
  • 解析带emoji和链接的聊天系统消息
  • 前端设计模式
  • 区块链技术特点之去中心化特性
  • 让你的分享飞起来——极光推出社会化分享组件
  • 探索 JS 中的模块化
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 责任链模式的两种实现
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 我们雇佣了一只大猴子...
  • ​第20课 在Android Native开发中加入新的C++类
  • #etcd#安装时出错
  • (1)(1.13) SiK无线电高级配置(五)
  • (3)nginx 配置(nginx.conf)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (动态规划)5. 最长回文子串 java解决
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Core引入性能分析引导优化
  • .net 后台导出excel ,word
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net开发时的诡异问题,button的onclick事件无效
  • /proc/interrupts 和 /proc/stat 查看中断的情况