postgresql和kingbase关于模糊查询大小写兼容问题

在mysql中,会有相关的like关键词,并且默认的是忽略大小写的。但是在postgresql和kingbase中,只有ilike关键字,并且默认是大小写敏感的。当我们使用mybatisplus的时候,默认提供的api也只有like()。这里提供一种方式来对原始api进行拓展

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.Properties;/*** sql查询拦截器* <p>* 模糊查询时忽略大小写* </p>* @author lsh* @version 1.0* @date 2022/5/10 11:13*/
@Slf4j
@Component
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class FuzzyQueryInterceptor implements Interceptor{private static final String FUZZY_QUERY_KEY = "like";private static final String IGNORE_FUZZY_QUERY_KEY = "ilike";@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 这里添加判断容器中是否为KingBase获取postgresql的代码//拦截StatementHandler,获取Mybatis对象属性StatementHandler statementHandler = (StatementHandler) invocation.getTarget();MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,new DefaultReflectorFactory());MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");//执行mapper方法的全路径名String id = mappedStatement.getId();//只拦截查询语句,将like关键字替换成ilike,以忽略大小写if (SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())){BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();sql=sql.replaceAll("\\s+"," ");if (StringUtils.containsIgnoreCase(sql," like ") || StringUtils.containsIgnoreCase(sql," like ?")){String mSql = sql.replaceAll("(?i)"+FUZZY_QUERY_KEY ,IGNORE_FUZZY_QUERY_KEY )log.debug(id + ":原始查询语句 ==> " + sql);log.debug(id + ":替换后的查询语句 ==> " + mSql);//通过反射修改sql语句Field field = boundSql.getClass().getDeclaredField("sql");field.setAccessible(true);field.set(boundSql, mSql);}}//执行结果return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}

直接通过拦截器的方式,将select语句进行分析,当有like的时候将进行转为ilike

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

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

相关文章

CANoe实际项目中文件夹的规划

本人&#xff0c;之前设计了一个CANoe工程&#xff0c;由于工程设计之初没有设计好文档的归纳分类&#xff0c;导致文件查找起来非常费劲。 为了避免以后出现文件混乱&#xff0c;不可查找的问题&#xff0c;故特此归纳说明。 建立工程时&#xff1a; 第1步就应该设计好文档…

基于51单片机的加油站计费系统

基于51单片机的加油站计费系统[proteus仿真] 计费检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个108基于51单片机的加油站计费系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&#…

“软件老兵”的新征程:从代码到方案,40岁转身更显智慧锋芒

在快速迭代的软件行业&#xff0c;许多经验丰富的软件工程师&#xff0c;随着年岁的增长&#xff0c;发现自己在纯技术领域的竞争力似乎逐渐不敌那些刚刚踏入职场的00后工程师。 面对这一挑战&#xff0c;一些“软件老兵”选择转换跑道&#xff0c;将目光投向了方案工程师这一新…

EasyExcel实现三级联动

前言 项目中需要在导出的模板中新增三级联动的功能&#xff0c;类似省市区的联动。在网上找了一些方法&#xff0c;都不能直接使用&#xff0c;需要进行修改。本文主要分享一下&#xff0c;改后的代码&#xff0c;可以直接使用。 代码 public class CascadeWriteHandler imp…

Linux同时安装多个版本的JDKlinux多版本JDK切换配置- [Centos 安装JDK]

Linux同时安装多个版本的JDK&linux多版本JDK切换配置- [Centos 安装JDK] 一、查询系统是否已经安装jdk rpm -qa|grep java 或 rpm -qa|grep jdk 或 rpm -qa|grep gcj 二、卸载已安装的jdk Centos7存在已安装的JDK1.7时&#xff0c;可以使用以下方式删除1.7的openJDK rp…

「优选算法刷题」:两整数之和(位运算解法)

一、题目 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5二、思路解析 其实笔试遇到这种题&…

python数据类型-元组

1 元组(tuple)的定义 元组是集合类型&#xff0c;和列表类似&#xff0c;元组中的元组类型可以不同&#xff0c;元素间用逗号隔开&#xff0c;和列表的不同之处在于&#xff1a; 1 元组的元组不可改变&#xff0c;也被称为只读列表 2 且元组用括号()表示&#xff0c;列表用方括…

月入过万比打工强,在家就能做steam搬砖项目真的假的

每天都有粉丝私下跟我聊天&#xff0c;讨论Steam搬砖项目到底是不是真的&#xff0c;到底能不能做。你想让我详细说说。那么今天就和大家详细聊聊这个月入过万元的项目。 简单来说&#xff0c;Steam搬砖项目就是在国外蒸汽上采购游戏道具&#xff0c;在国内网易buff平台上销售…

C# 求幂算法,最大公约数,最小公倍数

求幂算法概念 求幂算法是一种用于计算一个数的幂的算法。在C#中&#xff0c;可以使用两种方法来实现求幂操作&#xff1a;使用Math.Pow()函数或使用循环实现乘法运算。 方式1 double result Math.Pow(baseNumber, exponent); 方式2 double result 1; for (int i 0; i &l…

CVPR 2023: DBARF: Deep Bundle-Adjusting Generalizable Neural Radiance Fields

我们使用以下 6 个分类标准来解释本文的研究主题: 1. 神经表示: 隐式: 这种表示使用神经网络直接将空间中的 3D 点映射到其颜色和密度。网络充当“黑盒”函数,其内部工作原理无法直接解释。示例包括 NeRF、MPR-NeRF 和 Plenoxels。显式: 这种表示将每个体素或顶点的颜色和密…

实践理解 Transactional 是否生效

实践理解 Transactional 是否生效 示例&#xff1a; 新建一个订单表 tb_order_test 。 手动插入一条数据。 然后在代码中&#xff0c;根据 id 更新&#xff0c;如果更新成功&#xff0c;那么 update_time 会变化。 代码中执行 1/0; 由于 0不能做为除数&#xff0c;代码会抛…

MySQL 可重复读隔离级别,完全解决幻读了吗?

文章目录 前言一、什么是幻读&#xff1f;二、快照读是如何避免幻读的&#xff1f;三、当前读是如何避免幻读的&#xff1f;四、幻读被完全解决了吗&#xff1f;场景1场景2 总结 前言 MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」&#xff0c;但是它很大程度上避免幻读…

第 10 章:在C++中使用协程进行系统编程

最后一章专门介绍了一项对系统编程非常有用的功能&#xff0c;但这在C标准中相对较新。协程对象迅速找到了应用&#xff0c;成为了一等公民的状态机对象。它们的强大之处在于隐藏了协程帧后面的逻辑。请注意&#xff0c;这是一个高级主题&#xff0c;且C的协程接口既不简单也不…

交叉注意力融合2024创新方案汇总,附配套模块和代码

多模态学习和注意力机制是当前深度学习研究的热点领域之一&#xff0c;而交叉注意力融合作为这两个领域的结合点&#xff0c;具有很大的发展空间和创新机会。 作为多模态融合的一个重要组成部分&#xff0c;交叉注意力融合通过注意力机制在不同模块之间建立联系&#xff0c;促…

【C语言】main函数的参数形式

一、思考 在C语言中int main()&#xff0c;是最初接触该语言使用的形式。后面学习到函数部分&#xff0c;意识到int main()就是int main(void)&#xff0c;意为main函数没有参数。再到后面却又有int main(int argc, char *argv[])这种参数形式。 不禁疑问&#xff0c;main函数的…

校招春招,在线测评一般测试哪些内容?

在校园招聘这一块&#xff0c;很多应届毕业生会相当在乎&#xff0c;对于他们来说&#xff0c;如果在学校期间就找到工作是比较轻松的事情&#xff0c;不用担心毕业之后找工作困难重重&#xff0c;可以稳稳当当毕业。但想要迅速通过招聘也不容易&#xff0c;在校招春招上面&…

深度学习电脑配置有什么要求?

随着人工智能和机器学习的快速发展&#xff0c;深度学习已经成为了许多领域的重要工具。然而&#xff0c;深度学习的应用需要强大的计算能力&#xff0c;因此对于想要进行深度学习的用户来说&#xff0c;选择一台合适的电脑是必不可少的。本文将重点介绍深度学习电脑配置的要求…

2023年OceanBase开发者大会:核心内容与学习收获(附大会核心PPT下载)

本次大会邀请了众多业界领袖、技术大咖和开发者&#xff0c;共同探讨数据库领域的技术发展趋势和未来机会&#xff0c;与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;分享全新的产品 roadmap&#xff0c;交流场景探索和最佳实践。 一、大会核心内容 …

在服务器上下载google云端硬盘文件

遇到问题 下载谷歌硬盘&#xff08;drive.google.com开头&#xff09;的用wget不行&#xff0c;用wget说无法解析地址。 解决方法 1. 安装gdown pip install gdown2. 保存硬盘地址到我的谷歌网盘里&#xff0c;用如下右键复制的方式。 3.修改权限 右键共享处&#xff0c;…

Message Queue --- RabbitMQ

MessageQueue Intro 什么是MQ为什么使用MQ常见的MQ 什么是MQ MQ全称是Message Queue&#xff0c;消息的队列&#xff0c;因为是队列&#xff0c;所以遵循FIFO 先进先出的原则&#xff0c;它是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;M…