【解决】sql中包含问号(?),导致mybatis解析错误

2024-08-30 16:20

本文主要是介绍【解决】sql中包含问号(?),导致mybatis解析错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解决mybatis解析sql中问号报错

  • 存在问题
  • 解决方案一
  • 解决方案二

文章来自我的博客

存在问题

今天在使用 mybatis 处理动态 sql (PostgreSQL 数据库)的时候遇到了一个问题:
sql语句中本身包含 ? 的时候 mybatis 解析参数会把 sql语句中的 ?当作占位符 给解析成变量 导致sql查询失败
案例如下:
我这里存储的是jsonb类型数据 大概如下:

{"str": "param","arr": ["param1","param2"]
}

我的需求是:想要获取json列的数据中数组arr中包含param1的数据 得到的sql如下:

SELECT *
FROM your_table
WHERE tags->'arr' ?| ARRAY['paam1'];

这个sql在我们的sql连接器中执行是完全没问题的,但是在mybatis中使用这个sql的时候?|中的?会被mybatis当作占位符 替换成参数
例子如下:

// 这里是mapper接口
public interface testMapper {List<User> getUser(@Param("sysId") String sysId);
}
<!--这里是xml文件-->
<select id="getUser" resultType="User">SELECT *FROM userWHERE tags -> 'arr' ?| ARRAY[#{sysId}]
</select>

假如我传入的sysIdaaa那么最后我们查询出来的sql就会变成:

SELECT * FROM user WHERE tags -> 'arr' 'aaa'| ARRAY[?] 

同时代码报错:

org.springframework.dao.DataIntegrityViolationException: 
### Error querying database.  Cause: org.postgresql.util.PSQLException: 未设定参数值 2 的内容。
### The error may exist in file [D:\ffcs-progect\back\gops-timing-calculation\target\classes\mybatis\AnalyNetElementMapper.xml]
### The error may involve com.ffcs.iod.app.modules.analy.mapper.NetElementMapper.test-Inline
### The error occurred while setting parameters
### SQL: SELECT *         FROM user         WHERE tags -> 'arr' ?| ARRAY[?]
### Cause: org.postgresql.util.PSQLException: 未设定参数值 2 的内容。
; 未设定参数值 2 的内容。; nested exception is org.postgresql.util.PSQLException: 未设定参数值 2 的内容。

由上可以看到?|运算符的?被替换了 而不是 我们参数 ,参数的位置还是空的。下面给出两种我测试都可以的方案,但是个人比较推荐第二种方案。

解决方案一

?| 写成??|也就是在问号的前面多加一个问号,这样就能解决了。
例如:

<select id="getUser" resultType="User">SELECT *FROM userWHERE tags -> 'arr' ??| ARRAY[#{sysId}]
</select>

这种方法虽然在解析的时候还是会显示如下sql:

SELECT * FROM user WHERE tags -> 'arr' 'aaa'?| ARRAY[?] 

但是代码是没有报错的,同时也可以查询出来数据。

解决方案二

使用pg数据库内置函数jsonb_exists_any(),这个方法比较推荐

<select id="getUser" resultType="User">SELECT *FROM userWHERE jsonb_exists_any(tags -> 'arr', ARRAY[#{sysId}])
</select>

这篇关于【解决】sql中包含问号(?),导致mybatis解析错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121318

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my