拼接sql字符串工具类

  1. 申明注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface StrSqlAnnotation {/*** 表字段名称,如"create_name"** @return*/String filedName() default "";/*** 类型 STR-字符串 LIST-集合* {@link com.ltd.ccci.svc.transport.api.constant.CommonSymbolConstant}** @return*/String type() default CommonSqlKeyWordConstant.LIKE_IN_TYPE;}
  1. 相关常量类
    a. sql拼接常量:CommonSqlKeyWordConstant
public class CommonSqlKeyWordConstant {public static final String AND = "AND ";public static final String OR = "OR";public static final String NOT = "NOT";public static final String IN = "IN";public static final String NOT_IN = "NOT IN";public static final String LIKE = "LIKE";public static final String NOT_LIKE = "NOT LIKE";public static final String EQ = "=";public static final String NE = "<>";public static final String GT = ">";public static final String GE = ">=";public static final String LT = "<";public static final String LE = "<=";/*** 搜索条件-like or eq*/public static final String LIKE_IN_TYPE = "LIKE_IN_TYPE";}

b. 符号常量:CommonSymbolConstant(可不使用)

public class CommonSymbolConstant {private CommonSymbolConstant() {}/*** 横杠*/public static final String BAR = "-";/*** 波浪号*/public static final String TILDE = "~";/*** 下划线*/public static final String UNDERLINE = "_";/*** 斜杠*/public static final String SLASH = "/";/*** 冒号*/public static final String COLON = ":";/*** 分号*/public static final String SEMICOLON = ";";/*** 逗号*/public static final String COMMA = ",";/*** 点*/public static final String POINT = ".";/*** 顿号*/public static final String PAUSE = "、";/*** 点*/public static final String EMPTY = "";/*** 空格*/public static final String BLANK = " ";/*** 单引号*/public static final String SINGLE_QUOTES = "'";/*** 正括号*/public static final String OPEN_BRACKET = "(";/*** 反括号*/public static final String CLOSE_BRACKET = ")";
}
  1. 工具类:SearchUtil
public class SearchUtil {/*** 翻译单个实体** @param obj 实体信息*/public static <T, V> QueryWrapper<V> getSearchWrapper(T obj, Class<V> ignoredClazz) {QueryWrapper<V> wrapper = new QueryWrapper<>();// 防止未传条件不拼接where条件if (!ObjectUtil.isEmpty(obj)) {try {Class<?> aClass = obj.getClass();Map<String, Field> fields = getAllFileds(aClass);for (Field field : fields.values()) {if (field.isAnnotationPresent(StrSqlAnnotation.class)) {field.setAccessible(true);StrSqlAnnotation annotation = field.getAnnotation(StrSqlAnnotation.class);String filedName = annotation.filedName();if (StringUtils.isBlank(filedName)) {filedName = StrUtil.toUnderlineCase(field.getName());}String type = annotation.type();Object object = field.get(obj);if (ObjectUtil.isNotEmpty(object)) {Class<?> filedClass = object.getClass();String str = object.toString().trim();// 日期格式单独转化if (filedClass.equals(LocalDateTime.class)) {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);str = ((LocalDateTime) object).format(dateTimeFormatter);} else if (filedClass.equals(LocalDate.class)) {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN);str = ((LocalDate) object).format(dateTimeFormatter);}switch (type) {// like incase CommonSqlKeyWordConstant.LIKE_IN_TYPE -> {String[] split = str.split(",");if (split.length > 1) {wrapper.in(filedName, Arrays.asList(split));} else {wrapper.like(filedName, str);}}// incase CommonSqlKeyWordConstant.IN -> {String parse = JSONUtil.toJsonStr(object);List<String> list = JSONUtil.toList(parse, String.class);// LocalDateTime类型如果是集合传入,接收时类型为Long。时间集合建议传List<String>if (CollUtil.isNotEmpty(list)) {wrapper.in(filedName, list);}}// likecase CommonSqlKeyWordConstant.LIKE -> wrapper.like(filedName, str);// =case CommonSqlKeyWordConstant.EQ -> wrapper.eq(filedName, str);// >=case CommonSqlKeyWordConstant.GE -> wrapper.ge(filedName, str);// <=case CommonSqlKeyWordConstant.LE -> wrapper.le(filedName, str);default -> {}}}}}} catch (Exception e) {throw new ApiException(MsgUtils.getMessage("biz.common.StrFiledError"));}}return wrapper;}/*** 获取所有字段含父级** @param aClass 实体类* @return 所有字段信息*/private static Map<String, Field> getAllFileds(Class<?> aClass) {// key-字段名  value-字段信息Map<String, Field> fileds = new HashMap<>();List<Field> fieldList = new ArrayList<>();Class<?> tempClass = aClass;//当父类为null的时候说明到达了最上层的父类(Object类).while (tempClass != null) {fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));//得到父类,然后赋给自己tempClass = tempClass.getSuperclass();}for (Field field : fieldList) {fileds.put(field.getName(), field);}return fileds;}}
  1. 使用示例
    实体类注解使用
    @Schema(title = "线路编号")@StrSqlAnnotation(filedName = "no")private String no;@Schema(title = "物流供应商编码-单个查询-精确查询")@StrSqlAnnotation(type = CommonSqlKeyWordConstant.EQ)private String logisticsSupplierCode;@Schema(title = "物流合同号")@StrSqlAnnotation()private String logisticsContractNo;@Schema(title = "物流供应商编码")@StrSqlAnnotation(filedName = "logistics_supplier_code", type = CommonSqlKeyWordConstant.IN)private List<String> logisticsSupplierCodes;

LambdaQueryWrapper使用示例

private LambdaQueryWrapper<LineMainDO> dealSearchInfo(LinePageReq req, SFunction<LineMainDO, ?> sortFiled, boolean whetherAsc) {LambdaQueryWrapper<LineMainDO> lambdaQuery = SearchUtil.getSearchWrapper(req, LineMainDO.class).lambda();if (CollUtil.isEmpty(req.getSortItems())) {lambdaQuery.orderBy(true, whetherAsc, sortFiled);}return lambdaQuery;}

xml使用示例
service

    public CommonPage<ReceiptPageDTO> queryPage(ReceiptPageReq req) {QueryWrapper<ReceiptMainDO> searchWrapper = SearchUtil.getSearchWrapper(req, ReceiptMainDO.class);IPage<ReceiptPageDTO> page = receiptMainMapper.queryPage(MPPager.buildPage(req), searchWrapper);return MPCommonPage.restPage(page );}

mapper

  /*** 运输签收分页(明细联表)** @param ipage 分页信息* @param sql   高级搜索条件sql* @return 分页信息*/IPage<ReceiptPageDTO> queryPage(Page<ReceiptMainDO> ipage, @Param(Constants.WRAPPER) QueryWrapper<ReceiptMainDO> sql);

xml

 <select id="queryPage" resultType="com.ltd.ccci.svc.transport.api.dto.receipt.ReceiptPageDTO"><select id="queryPage" resultType="com.ltd.ccci.svc.transport.api.dto.receipt.ReceiptPageDTO">SELECT *FROM receipt_main m,receipt_detail d<choose><when test="ew.customSqlSegment != null and ew.customSqlSegment != ''">${ew.customSqlSegment} and</when><otherwise>where</otherwise></choose>m.id = d.receipt_main_idand d.del_flag = 0and m.del_flag = 0order by m.update_time, d.create_time, d.id</select>

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

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

相关文章

佛教祭拜小程序-寺庙小程序-纪念馆小程序

大家好&#xff0c;我是程序员小孟。 现在有很多的产品或者工具都开始信息话了&#xff0c;寺庙或者佛教也需要小程序吗&#xff1f; 当然了&#xff01; 前面我们还开发了很多寺庙相关的小程序&#xff0c;都有相关的介绍&#xff1a; 1,优质的寺庙小程序-H5寺庙网页 今天…

指定文件夹按指定数量分组文件

指定文件夹按指定数量分组文件 背景和环境说明 本程序使用 python 3.10 机器学习&#xff0c;打标中需要对数据集进行分批次&#xff0c;比如10个人&#xff0c;需要分10组&#xff0c;熟练的人分多个点等情况。需要对标注的图片进行分组,分批次导入标注系统进行标注。 依赖包…

机器学习多场景实战

机器学习已不再局限于理论探讨&#xff0c;而是广泛渗透到我们生活的方方面面&#xff0c;成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品&#xff0c;到金融风控领域精准识别欺诈交易&#xff1b;每一个应用场景都是机器学习技…

(学习笔记)数仓建模

数仓建模 OLAP数仓分层数据模型数据模型建设方法模型建设具体流程模型数据域事实表设计事实表拉链表 数据模型规范表命名(采用阿里one-data设计)字段命名(采用阿里one-data设计)数据模型标注规范 数据模型发展周期 OLAP OLTP&#xff1a;概念全称OnLine Transaction Processin…

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后&#xff0c;您将能够&#xff1a; • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中&#xff0c;将要求您连接网络设备并配置主机实现基本的网络…

第三部分:领域驱动设计中的SPECIFICATION(规格说明)

领域驱动设计中的SPECIFICATION&#xff08;规格说明&#xff09; 1. SPECIFICATION的定义 SPECIFICATION&#xff1a;在领域驱动设计&#xff08;Domain-Driven Design, DDD&#xff09;中&#xff0c;规格说明&#xff08;Specification&#xff09;是一个明确的业务规则集…

【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)

前言 研究AI的同学们面对的一个普遍痛点是&#xff0c;刚开始深入研究一项新技术&#xff0c;没等明白透彻&#xff0c;就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码&#xff0c;5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余&#xff0…

第101天:权限提升-Win 本地用户进程注入令牌窃取ATSCPS 服务命令

目录 思维导图 案例一&#xff1a; WIN-本地用户-AT&SC&PS 命令 AT命令 sc PS 案例二&#xff1a;WIN-本地用户-进程迁移注入获取 msf 案例三&#xff1a;WIN-本地&Web-令牌窃取&土豆溢出 令牌窃取 土豆溢出 案例四&#xff1a; uac原理与绕过 思维…

【Qt】Frame和Widget的区别

1. 这两个伙计有啥区别&#xff1f; 2. 区别 2.1 Frame继承自Widget&#xff0c;多了一些专有的功能 Frame Widget 2.2 Frame可以设置边框

C51学习归纳4 --- 矩阵键盘

一、开发板原理图 我们可以看到这个键盘是4*4的&#xff0c;行可以由4个数据接口接收&#xff08;P1_4~7&#xff09;&#xff0c;列可以由4个数据接口接收&#xff08;P1_0~3)。 所以我们可让行作为扫描方向&#xff0c;或者列作为扫描方向&#xff0c;进行按键扫描。如何扫描…

VS2017配置OpenCV4.5.1

VS2017配置OpenCV 一、下载OpenCV二、配置OpenCV的电脑环境变量三、配置visual Studio添加路径复制文件到C盘 四、如何使用注意运行时选择Debug x64 五、报错&#xff1a;VSOpencv出现&#xff1a;xxx处有未经处理的异常: Microsoft C 异常: cv::Exception&#xff0c;位于内存…

鸟哥私房菜 摘录

鸟哥私房菜 摘录 解決問題的順序学习的基本方针&#xff0c;提供给大家参考&#xff1a; 解決問題的順序 先查閱硬體(有沒有超頻/記憶體模組/周邊網路設備的好壞等等)&#xff1b;檢查 /var/log 底下的登錄檔&#xff0c;尤其是 /var/log/messages 的內容&#xff1b;不要急&a…

@vue-office/excel遇到的问题 error in ./src/components/gem-histogram.base.vue?vuetype=templateid=691572

下载后一直抱这个错误 10:39:39 - Building for production... 10:40:36 ERROR Failed to compile with 41 errors2:40:31 AM 10:40:36 10:40:36 error in ./src/components/gem-histogram.base.vue?vue&typetemplate&id691572bb&scopedtrue 10:40:36 …

踩坑:ffmpeg_extract_subclip() 切分视频时阻塞卡死

之前跑代码时经常卡死&#xff0c;不知道问题出在哪 ffmpeg_extract_subclip(tmp_video_path, test_data["start"], test_data["end"], targetnamevideo_path)后来发现此代码时常会阻塞&#xff0c;不报error不退出&#xff0c;就一直在那卡着。 ffmpeg_…

GaussDB的数种形态

GaussDB作为一种新兴的关系型数据库产品&#xff0c;似乎有点让人摸不着头脑。有朋友问我GaussDB单机版怎么样&#xff0c;有人说GaussDB是分布式数据库&#xff0c;还有人说它是云数据库&#xff0c;还有人会把GaussDB和华为的数据仓库GaussDB DWS混为一谈。确实&#xff0c;公…

算法学习笔记——时间复杂度和空间复杂度

时间复杂度和空间复杂度 常数操作&#xff1a; 固定时间的操作&#xff0c;执行时间和数据量无关 位运算 > 算数运算 > 寻址 > 哈希运算&#xff0c;都是常数操作&#xff0c;哈希运算操作时间最慢 链表的get(i)方法不是常数操作&#xff0c;因为链表不是连续的存储…

颠沛流离学二叉树(完结撒花篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

MT2083 屠龙勇者

思路&#xff1a; 跟上题类似&#xff0c;贪心策略&#xff1a;w从小到大排序&#xff0c;每个头找到第一个>d的w 代码&#xff1a; #include <bits/stdc.h> using namespace std; #define ll long long const int N 1e5 10; int n, m; int d[N]; int w[N]; int …

Spring Security 注册过滤器关键点与最佳实践

在 Spring Security 框架中&#xff0c;注册过滤器是实现身份验证和授权的关键组件。正确配置和使用注册过滤器对于确保应用程序的安全性至关重要。以下是一些关于 Spring Security 注册过滤器的注意事项和最佳实践。 过滤器链顺序&#xff1a; 注册过滤器通常位于过滤器链的末…

使用 ultralytics 摄像头yolo推理

使用 ultralytics 摄像头yolo推理 官方网站 https://docs.ultralytics.com/ github https://github.com/ultralytics/ultralytics 搭建环境 # Install the ultralytics package using conda conda install -c conda-forge ultralyticslinux下摄像头推理 import cv2 from u…