【Mybatis plus】使用分页查询,报错 Parameter ‘xxx‘ not found. Available parameters are xxx

news2024/11/24 0:15:46

今天工作遇见Mybatis plus 分页查询遇到的错误,提示参数未绑定,现在记录一下。以下数据全部是MOCK信息

0 先给出错误场景

0.0 查询 Mapper

java entity 实体类

用 user 代替实体类信息

@Data
class User {
	private Long id;
	private String name;
	private String agx;
	private Integer age;
}

用 condition 代替查询信息

@Data
class Condition {
	private Long id;
	private String name;
	private String agx;
	private Integer age;
}

java mapper 接口方法

List<User> queryByCondition(Condition condition);
IPage<User> queryByCondition(Page<?> page, Condition condition);

Java mapper 所对应的 mapper.xml 信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="please ignore">
    <resultMap id="Base_Column_result_map"
               type="User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="agx" property="agx"/>
        <result column="age" property="age"/>
    </resultMap>

    <sql id="Base_Column_select_map">
        id, name, agx, age
    </sql>

    <select id="queryByCondition"
            parameterType="Condition"
            resultMap="Base_Column_result_map">
        SELECT
        <include refid="Base_Column_select_map"/>
        FROM
        t_wms_inv_inventory_asset
        <where>
            <if test="id != null">
                AND id = #{id}
            </if>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="agx != null">
                AND agx = #{agx}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>
</mapper>

异常信息

invoke method = queryByCondition exception
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:78)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
	at com.sun.proxy.$Proxy105.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForIPage(MybatisMapperMethod.java:122)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:86)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
	at com.sun.proxy.$Proxy154.queryInventoryAssets(Unknown Source)
	... 省略部分冗余信息
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
	at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:212)
	at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:120)
	at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2719)
	at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)
	at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
	at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:493)
	at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:457)
	at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46)
	at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
	at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32)
	at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32)
	at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39)
	at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:297)
	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:69)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy434.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	at sun.reflect.GeneratedMethodAccessor351.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
	... 76 common frames omitted

1 解决办法

step1: 给 mapper 接口方法加上具名参数指定,如下:

List<User> queryByCondition(@Param("condition") Condition condition);
IPage<User> queryByCondition(Page<?> page,@Param("condition") Condition condition);

tip: Page 参数不要加 具名 指示

step2: 修改 mapper.xml 的查询信息,都加上 具名 限定

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="please ignore">
    <resultMap id="Base_Column_result_map"
               type="User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="agx" property="agx"/>
        <result column="age" property="age"/>
    </resultMap>

    <sql id="Base_Column_select_map">
        id, name, agx, age
    </sql>

    <select id="queryByCondition"
            parameterType="Condition"
            resultMap="Base_Column_result_map">
        SELECT
        <include refid="Base_Column_select_map"/>
        FROM
        t_wms_inv_inventory_asset
        <where>
            <if test="condition.id != null">
                AND id = #{condition.id}
            </if>
            <if test="condition.name != null">
                AND name = #{condition.name}
            </if>
            <if test="condition.agx != null">
                AND agx = #{condition.agx}
            </if>
            <if test="condition.age != null">
                AND age = #{condition.age}
            </if>
        </where>
    </select>
</mapper>

到这里已经彻底解决上面的报错问题了,但是出于记录者合格的身份,把为什么报错的原因追踪陈列出来,有兴趣的朋友可以看看。


3 异常原因

mybatis plus 【或者说 mybtais 】会为每个 mapper 接口生成一个 proxy 类对象,用代理类对象的来实现调用 识别并组装 SQL,如下图:
代理类获取
然后调用代理类所代理的接口,去找到合适执行器,从而去解析和分析SQL语句和xml条件语句,如下:SQL解析
执行器的内部的关键代码如图:
获取执行器
如果是用Page + mapper 的形式当作执行方法的参数,那么它最终会定位到这里:
定位执行器
进入executeForPage内部,会发现如下code:
分页执行
其实分页的执行,底层调用的就是 sqlSession 的 selectList 方法【这也从侧面说明了,不能重写 mybatis plus 提供的 BaseMapper 的selectList 方法,因为会在这里出错】。其中 commnad.getName() 方法获取的是接口方法的全限定类名和路径param 是方法的执行参数,也就是pagecondition
最终会有一个拦截器,拦截代理方法的执行,识别和解析参数就在这一步,进入selectList方法,Debug into 进去可以发现,走到了这里:
拦截器
一步步向下点,最终会发现,走到这里,也就是条件节点解析处:
节点解析
node.apply()再调用,还是底部会调用
在这里插入图片描述
next向下,会走到ifSqlNode的判断
在这里插入图片描述
再向下,会走到如下判断,也就是出问题的地方:
在这里插入图片描述
由于没有指定全限定类名,context中的param并不能识别id信息,只能识别poge和condition的信息。

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

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

相关文章

一文带你了解MySQL数据库InnoDB_Buffer_Pool

前言 上篇文章介绍了MySQL中的存储引擎层主要负责数据的写入和读取&#xff0c;与底层的文件进行交互。MySQL在5.5 版本以后&#xff0c;MySQL默认存储引擎为 InnoDB&#xff0c;他的主要特性有&#xff1a; DML 操作(增、删、改)遵循 ACID(事务安全表) 模型&#xff0c;支持事…

造车十余年,创维从商用车向乘用车冲刺

近日&#xff0c;创维汽车在2023焕新升级发布会发布了3款最新车型。虽然很多人对于创维的印象&#xff0c;仍然停留在电视机概念上&#xff0c;但事实上&#xff0c;这家彩电大王早在13年前即跨界新能源车制造&#xff0c;其旗下公司纯电动客车销量连年稳居国内前三甲。 携成熟…

Vue组件-非单文本组件

非单文本组件(用的少) 在vue中&#xff0c;组件是有两种编写格式的&#xff0c;第一种格式叫非单文本组件&#xff0c;第二种格式叫单文本组件 非单文本组件&#xff1a;一个文件中含有多个组件&#xff0c;也叫多文本组件&#xff0c;比如demo.html里面包含js,css… 单文本…

PCL学习一:点云与PCL基础

参考引用 黑马机器人 | PCL-3D点云PCL(Point Cloud Library)学习记录 1. 点云概述 点云&#xff08;Point Cloud&#xff09;是三维空间中&#xff0c;表达目标空间分布和目标表面特性的点的集合点云通常可以从深度相机或激光雷达中直接获取&#xff0c;也可以从 CAD 等软件中…

JavaEE4(4/27)

目录 1.加锁 2.锁死和重入 3.线程安全的类 4.volatile 1.加锁 当两个线程同时对一个对象进行加锁的时候,会产生竞争 2.锁死和重入 如果一个线程对一个对象加了一次锁,在加一次出现死锁,就是不可重入,否则就是可重入 锁死:对同一个锁再加锁出现的死循环 实际上开发JVM的工程师…

守正创新,核心业务系统助推财务公司数字化转型

为落实国资委加快建设世界一流财务管理体系&#xff0c;推进财务公司数字化转型工作要求&#xff0c;交流总结财务公司同业工作经验&#xff0c;由中国电子主办、中电金信承办的“新核心 新动能——财务公司数字化转型专题研讨会”在京召开。会上中电金信发布了财务公司核心业务…

马斯克们叫停 GPT-5,更像是场行为艺术

目录 01 联名信说了什么&#xff1f; 02 发起方是谁&#xff1f; 03 谁签署了联名信&#xff1f; 04 联名信有哪些问题&#xff1f;三巨头的另外两位 Sam Altman 的表态 其他值得关注的署名者 比如马斯克。 另一个位于前列的署名者是 Stability AI 的创始人 Emad Most…

(剪花布条、客似云来)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 两道编程题~~~ 目录 文章目录 一、[编程题]客似云来 二、[编程题]剪花布条 一、[编程题]客似云来 链接&#xff1a;客似云来__牛客网 来源&#xff1a;牛客网 NowCoder开了一家早餐店&am…

线性回归原理与使用

1 回归 预测年薪 0.5 * 工作年限 0.7 * 学历数值 回归的目的就是预测 数值型的目标值。 求解回归方程式 系数 &#xff08;0.5 &#xff0c;0.7&#xff09;的过程就是 回归。 2 简单线性回归 样本特征只有一个的线性回归 &#xff0c;称为简单线性回归。 举例…

想搞懂 API ,先了解这些技术

在学习 API 相关技术之前&#xff0c;我们需要理解什么是 API。API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是为了帮助不同的应用程序之间实现数据和功能交换而设计的一组软件接口。使用 API&#xff0c;开发者可以访问底层数据…

c# 数据保存为PDF(一) (spire pdf篇)

文章目录 前言了解 Spire使用Spire.PDF1 创建简单的PDF文档2 创建带有格式的PDF文档&#xff08;使用Draw&#xff09;头部信息页眉页脚测试数据完整的代码 3 创建带有格式的PDF文档&#xff08;使用Gird&#xff09;小结 先上一个效果图 前言 项目中需要将一些数据转存为PDF …

unity GI Shader 实现

之前分享了一篇对unity全局光照的解析&#xff0c;里面提到了一些东西&#xff0c;需要在Shader内实现&#xff0c;在这一篇补上。 要实现对全局GI的shader实现&#xff0c;我们可以通过对unity内置的Lit进行解析查看。 烘焙的方式有很多种&#xff0c;选择合适的方式烘焙和使…

python-使用Qchart总结4-绘制多层柱状图

1、上代码 import sysfrom PyQt5.QtChart import QChart, QChartView, QBarCategoryAxis, QValueAxis, QBarSeries, QBarSet from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QMainWindow, QApplicationfrom untitled import Ui_MainWindow #从生成好的…

财报解读:连续三年逆势增长的背后,欧派家居到底靠的是什么?

能在过去3年逆势增长的家居企业并不多&#xff0c;而欧派家居就是其中一个。4月25日&#xff0c;欧派家居发布2022年年度报告。据年报数据显示&#xff0c;2022年&#xff0c;欧派家居共实现营业收入224.80亿元&#xff0c;净利润约26.88亿元。 从2020年到2022年&#xff0c;欧…

设计模式——单例设计模式

目录 一、设计模式概述和分类 1.1 设计模式介绍 1.2 23种设计模式 二、创建型设计模式-单例模式 2.1 介绍 2.2 八种单例模式的创建方式 2.2.1 饿汉式&#xff08;静态常量&#xff09; 2.2.2 饿汉式&#xff08;静态代码块&#xff09; 2.2.3 懒汉式&#xff08;线程不…

SSH客户端工具输入目标地址端口远程失败故障原因和解决方案

问题表现&#xff1a;SSH客户端工具输入目标地址端口远程失败时&#xff0c;出现ssh client 报 algorithm negotiation failed的异常信息。 使用SSH Secure Shell Client连接Linux服务器的SSH的时候有时会出现错误提示信息&#xff1a;ssh algorithm negotiation failed。这是…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(三)系统性能测试

系统性能分析与测试 本章将首先对系统电路的噪声和温漂进行分析&#xff0c;而后对采集系统的性能进行 测试&#xff0c;并对测试数据进行分析。 5.1 高精度 AD 转换电路噪声和温漂分析 5.1.1 电阻噪声与温漂 1 、电阻的噪声 电阻是一种噪声源&#xff0c;其严重程度取…

与贵州公安面对面|欧科云链天眼中国行,他们都说“行”

4月28日&#xff0c;为期两天“链上天眼科技助警中国行贵州站”&#xff08;以下简称&#xff1a;贵州站&#xff09;迎来了尾声。 继首日亮相中共中央政法委员会机关报-法制日报社主办的“政法智能化建设技术装备及成果展巡展贵州站”&#xff0c;引发贵州省政法机关单位的广…

基于.Net开发的、支持多平台、多语言餐厅点餐系统

今天给大家推荐一套支持多平台、多语言版本的订单系统&#xff0c;适合餐厅、酒店等场景。 项目简介 这是基于.Net Framework开发的&#xff0c;支持手机、平板、PC等平台、多语言版本开源的点餐系统&#xff0c;非常适合餐厅、便利店、超市、酒店等&#xff0c;该系统基础功…

vue3+ts+vite自适应项目——搭建项目

系列文章目录 第一章&#xff1a;搭建项目 目录 系列文章目录 前言 一、搭建项目 二、安装sass 1.安装依赖 2.测试 三、引入element-plus 1.引入库 1.1 安装 2.2引入插件 2.3测试 2.自定义主题 四、实现自适应 1.安装 2.引入 总结 前言 本项目主要目的是熟练…