【解决】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

相关文章

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D