Specification封装一个类实现链式调用

import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.StringUtils;import java.util.Collection;public class SpecBuilder<T> {/*** JPA 2 引入了一个条件 API,您可以使用该 API 以编程方式构建查询。通过编写 ,您可以为域类定义查询的 where 子句。* 再退一步,这些标准可以被视为 JPA 标准 API 约束所描述的实体的谓词。*/private Specification<T> specification;/*** 逻辑与或 临时变量*/private String logic;public SpecBuilder<T> not() {this.logic = "not";return this;}public SpecBuilder<T> where() {this.logic = "where";return this;}public SpecBuilder<T> and() {this.logic = "and";return this;}public SpecBuilder<T> or() {this.logic = "or";return this;}/*** 处理逻辑* 实现链式调用判断 and or调用*/private void logic(Specification<T> specification) {// 直接调用 没有设置not where and or 默认是当前条件if (this.specification == null) {this.specification = specification;} else {// 不选 and or 默认andif (StringUtils.hasText(this.logic)) {switch (this.logic) {case "not":this.specification = Specification.not(specification);break;case "where":this.specification = Specification.where(specification);break;case "and":this.specification = this.specification.and(specification);break;case "or":this.specification = this.specification.or(specification);break;}} else {this.specification.and(specification);}}}/*** 模糊查询*/public SpecBuilder<T> like(String name, String value) {// 处理模糊需要符号if (!value.startsWith("%")) {value = "%" + value;}if (!value.endsWith("%")) {value = value + "%";}String finalValue = value;Specification<T> specification = ((root, query, cb) -> cb.like(root.get(name), finalValue));this.logic(specification);return this;}public SpecBuilder<T> notLike(String name, String value) {// 处理模糊需要符号if (!value.startsWith("%")) {value = "%" + value;}if (!value.endsWith("%")) {value = value + "%";}String finalValue = value;Specification<T> specification = ((root, query, cb) -> cb.notLike(root.get(name), finalValue));this.logic(specification);return this;}/*** 判断是不是null*/public SpecBuilder<T> isNull(String name) {Specification<T> specification = ((root, query, cb) -> cb.isNull(root.get(name)));this.logic(specification);return this;}/*** 判断是不是空的*/public SpecBuilder<T> isNotNull(String name) {Specification<T> specification = ((root, query, cb) -> cb.isNotNull(root.get(name)));this.logic(specification);return this;}public SpecBuilder<T> isEmpty(String name) {Specification<T> specification = ((root, query, cb) -> cb.isEmpty(root.get(name)));this.logic(specification);return this;}public SpecBuilder<T> isNotEmpty(String name) {Specification<T> specification = ((root, query, cb) -> cb.isNotEmpty(root.get(name)));this.logic(specification);return this;}/*** 等于*/public SpecBuilder<T> eq(String name, Object value) {Specification<T> specification = ((root, query, cb) -> cb.equal(root.get(name), value));this.logic(specification);return this;}public SpecBuilder<T> ne(String name, Object value) {Specification<T> specification = ((root, query, cb) -> cb.notEqual(root.get(name), value));this.logic(specification);return this;}/*** 大于*/public SpecBuilder<T> gt(String name, Number value) {Specification<T> specification = ((root, query, cb) -> cb.gt(root.get(name), value));this.logic(specification);return this;}/*** 大于等于*/public SpecBuilder<T> ge(String name, Number value) {Specification<T> specification = ((root, query, cb) -> cb.ge(root.get(name), value));this.logic(specification);return this;}/*** 小于*/public SpecBuilder<T> lt(String name, Number value) {Specification<T> specification = ((root, query, cb) -> cb.lt(root.get(name), value));this.logic(specification);return this;}/*** 小于等于*/public SpecBuilder<T> le(String name, Number value) {Specification<T> specification = ((root, query, cb) -> cb.le(root.get(name), value));this.logic(specification);return this;}/*** 两者之间*/public <Y extends Comparable<? super Y>> SpecBuilder<T> between(String name, Y v1, Y v2) {Specification<T> specification = ((root, query, cb) -> cb.between(root.get(name), v1, v2));this.logic(specification);return this;}public SpecBuilder<T> in(String name, Collection<?> value) {Specification<T> specification = ((root, query, cb) -> root.get(name).in(value));this.logic(specification);return this;}public SpecBuilder<T> in(String name, Object... value) {Specification<T> specification = ((root, query, cb) -> root.get(name).in(value));this.logic(specification);return this;}public SpecBuilder<T> notIn(String name, Collection<?> value) {Specification<T> specification = ((root, query, cb) -> cb.not(root.get(name).in(value)));this.logic(specification);return this;}public SpecBuilder<T> notIn(String name, Object... value) {Specification<T> specification = ((root, query, cb) -> cb.not(root.get(name).in(value)));this.logic(specification);return this;}public Specification<T> build() {return this.specification;}
}

使用

 @Testpublic void testJpa() {Specification<Info> specification = new SpecBuilder<>().where().like("authMethod", "cookie").and().like("authMethod", "cookie").notLike("authMethod", "apikey").notIn("id", "1", "2", "3").in("id", "12").build();List<Info> list = apiAuthInfoRepository.findAll(specification);System.out.println(list);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476705.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

《Python基础》之pip换国内镜像源

目录 推荐镜像源网址&#xff1a; 方法一&#xff1a;手动换源 方法二&#xff1a;命令提示符指令换源 临时换源 推荐镜像源网址&#xff1a; 阿里云&#xff1a;Simple Indexhttp://mirrors.aliyun.com/pypi/simple/ 华为云&#xff1a;Index of python-local https://m…

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…

Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…

30. 并发编程

一、什么是多任务 如果一个操作系统上同时运行了多个程序&#xff0c;那么称这个操作系统就是 多任务的操作系统&#xff0c;例如&#xff1a;Windows、Mac、Android、IOS、Harmony 等。如果是一个程序&#xff0c;它可以同时执行多个事情&#xff0c;那么就称为 多任务的程序。…

ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路

目录 场景在搜索引擎和推荐引擎中&#xff0c;对相似文章去重是一个非常重要的环节&#xff0c;另外是拍照识花、摇一摇搜歌等场景都可以使用它快速检索。 基于敏感性哈希的检索更擅长处理字面上的相似而不是语义上的相似。 向量空间模型ANN检索加速思路 局部敏感哈希编码 随…

mongodb多表查询,五个表查询

需求是这样的&#xff0c;而数据是从mysql导入进来的&#xff0c;由于mysql不支持数组类型的数据&#xff0c;所以有很多关联表。药剂里找药物&#xff0c;需要药剂与药物的关联表&#xff0c;然后再找药物表。从药物表里再找药物与成分关联表&#xff0c;最后再找成分表。 这里…

《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期

消除误解&#xff0c;课程资料逐步公开。 复习资料&#xff1a; Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷&#xff1a; 开卷考试&#xff0c;时间&#xff1a; 2024年11月16日 001 002 003 004 005 ……………………装………………………

DataWorks快速入门

DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等解决方案提供统一的全链路大数据开发治理平台。本文以DataWorks的部分核心功能为例&#xff0c;指导您使用DataWorks接入数据并进行业务处理、周期调度以及数据…

0基础跟德姆(dom)一起学AI NLP自然语言处理01-自然语言处理入门

1 什么是自然语言处理 自然语言处理&#xff08;Natural Language Processing, 简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域. 2 自然语言处理的发展简史 3 自然语言处理的应用场景 语音助手机器翻译搜索引擎智能问答...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…

Cmakelist.txt之win-c-udp-client

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(c_udp_client LANGUAGES C) ​ add_executable(c_udp_client main.c) ​ target_link_libraries(c_udp_client wsock32) ​ ​ include(GNUInstallDirs) install(TARGETS c_udp_clientLIBRARY DESTINATION $…

移动充储机器人“小奥”的多场景应用(上)

一、高速公路服务区应用 在高速公路服务区&#xff0c;新能源汽车的充电需求得到“小奥”机器人的及时响应。该机器人配备有储能电池和自动驾驶技术&#xff0c;能够迅速定位至指定充电点&#xff0c;为待充电的新能源汽车提供服务。得益于“小奥”的机动性&#xff0c;其服务…

Mono Repository方案与ReactPress的PNPM实践

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 Mono Repository方案与ReactPress的PNPM实践 在当今软件开发领域&#xff0c;Mono Repository&#xff08;简称Monorepo&#xff09;已成为一种流行的代码管理方式&#xff0c;特…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

ROS之什么是Node节点和Package包?

1.什么是ROS&#xff1f; 官方术语&#xff1a;ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个开源的、模块化的机器人软件框架。它为机器人开发提供了一套工具和库&#xff0c;用于实现硬件抽象、设备驱动、消息传递、多线程管理等功能…

【1.4 Getting Started--->Support Matrix】

主页&#xff1a;支持矩阵 这些支持矩阵概述了 TensorRT API、解析器和层支持的平台、特性和硬件功能。 Support Matrix Abstract 这些支持矩阵概述了 TensorRT API、解析器和层所支持的平台、功能和硬件功能。 有关之前发布的 TensorRT 文档&#xff0c;请参阅 TensorRT 档…

C语言教程指针笔记整理(二)

https://www.bilibili.com/video/BV1cx4y1d7Ut?spm_id_from333.788.videopod.episodes&vd_sourcee8984989cddeb3ef7b7e9fd89098dbe8&p107 本篇为贺宏宏老师C语言教程指针部分笔记整理 //8-19 一维数组和二维数组 // int arr[4] [][][][] //含义&#xff1a; //1.arr…