MybatisPlusException:Failed to process,Error SQL异常报错如何解决

今天小编给大家分享一下MybatisPlusException:Failed to process,Error SQL异常报错如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、问题描述

 Error querying database.  Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: SELECT  
        goods_spu.`id`,
        goods_spu.`tenant_id`,
        goods_spu.`shop_id`,
        goods_spu.`spu_code`,
        goods_spu.`name`,
        goods_spu.`sell_point`,
        null `description`,
        goods_spu.`category_first`,
        goods_spu.`category_second`,
        goods_spu.`category_shop_first`,
        goods_spu.`category_shop_second`,
        goods_spu.`pic_urls`,
        goods_spu.`shelf`,
        goods_spu.`sort`,
        goods_spu.`price_down`,
        goods_spu.`price_up`,
        goods_spu.`sale_num`,
        goods_spu.`create_time`,
        goods_spu.`update_time`,
        goods_spu.`spec_type`,
        goods_spu.`del_flag`,
        goods_spu.`points_give_switch`,
        goods_spu.`points_give_num`,
        goods_spu.`points_deduct_switch`,
        goods_spu.`points_deduct_scale`,
        goods_spu.`points_deduct_amount`,
        goods_spu.`freight_templat_id`,
        goods_spu.`verify_status`,
        goods_spu.`verify_detail`,
        goods_spu.`channel`,
        goods_spu.`self_pick_addr_id`
     , sum(s.stock) as stock
        FROM goods_spu as goods_spu
        left join goods_sku as s  on goods_spu.id=s.spu_id
        group by goods_spu.id;
         WHERE  goods_spu.`name` LIKE CONCAT('%',?,'%') ### Cause: 
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
    at com.sun.proxy.$Proxy180.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForIPage(MybatisMapperMethod.java:121)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:85)
    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.$Proxy195.selectPage1WithStock(Unknown Source)
    at com.joolun.cloud.mall.admin.service.impl.GoodsSpuServiceImpl.page1WithStock(GoodsSpuServiceImpl.java:72)
    at com.joolun.cloud.mall.admin.service.impl.GoodsSpuServiceImpl$$FastClassBySpringCGLIB$$cb4904f8.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.joolun.cloud.mall.admin.service.impl.GoodsSpuServiceImpl$$EnhancerBySpringCGLIB$$936a8c1a.page1WithStock(<generated>)
    at com.joolun.cloud.mall.admin.controller.GoodsSpuController.getGoodsSpuPageWithStock(GoodsSpuController.java:82)
    at com.joolun.cloud.mall.admin.controller.GoodsSpuController$$FastClassBySpringCGLIB$$4d6ff776.invoke(<generated>)

MybatisPlusException:Failed to process,Error SQL异常报错如何解决

二、需求描述

运营提出,对首页进行店铺装修时,需看到库存字段,

这样不会上到了0库存的品,导致了用户下单体验的问题。

因此,在Mybatis Plus中新增了库存字段以展示

三、定位错误代码

因为原来这个接口是是做了一个基于Mybatis Plus的分页,但是因为库存这个字段,存在sku的表中

因此使用left join ,但是又因为SPU与SKU之间是一对多的关系,因此会有多个0库存的情况,

这里采用了count进行加和的方式,不得不说,设计的非常巧妙,因为加和起来库存都为0的话,说明肯定是0库存的呀。

因此有了以下代码

<select id="selectPage1WithStock" resultMap="goodsSpuMap5">
		SELECT <include refid="goodsSpuSql2"/>, sum(s.stock) as stock
		FROM goods_spu as goods_spu
		left join goods_sku as s  on goods_spu.id=s.spu_id
		group by goods_spu.id;
		<where>
			<if test="query.shopId != null">
				AND goods_spu.`shop_id` = #{query.shopId}
			</if>
			<if test="query.shelf != null">
				AND goods_spu.`shelf` = #{query.shelf}
			</if>
			<if test="query.verifyStatus != null">
				AND goods_spu.`verify_status` = #{query.verifyStatus}
			</if>
			<if test="query.categorySecond != null">
				AND goods_spu.`category_second` = #{query.categorySecond}
			</if>
			<if test="query.name != null">
				AND goods_spu.`name` LIKE CONCAT('%',#{query.name},'%')
			</if>
			<if test="query.spuCode != null">
				AND goods_spu.`spu_code` = #{query.spuCode}
			</if>
			<if test="query.specType != null">
				AND goods_spu.`spec_type` = #{query.specType}
			</if>
			<if test="query.pointsGiveSwitch != null">
				AND goods_spu.`points_give_switch` = #{query.pointsGiveSwitch}
			</if>
			<if test="query.pointsDeductSwitch != null">
				AND goods_spu.`points_deduct_switch` = #{query.pointsDeductSwitch}
			</if>
		</where>
	</select>

以下代码看起来,没有问题,但是确有一个问题,注意在,存在一个分号,

我们都知道,分号是一段SQL语句的结尾,所以,

以上代码肯定是后面的语句肯定是执行不到的

但是到底是group by 语句放在前面呢?还是where 语句在前,这个问题,可以直接在数据库验证下即可

四、数据库验证

写法一:WHERE在前,GROUP BY在后

SELECT
	goods_spu.*, sum(s.stock) AS stock
FROM
	goods_spu AS goods_spu
LEFT JOIN goods_sku AS s ON goods_spu.id = s.spu_id
WHERE
	goods_spu.`name` LIKE CONCAT('%', 'A', '%')
GROUP BY
	goods_spu.id

发现,数据能够正常查询

MybatisPlusException:Failed to process,Error SQL异常报错如何解决

写法二:GROUP BY在前,WHERE在后

会发现无法正常查询出来结果

MybatisPlusException:Failed to process,Error SQL异常报错如何解决

五、修改Mybatis中的SQL语句

经过以上的验证,得到了最终修改之后的SQL语句如下

<select id="selectPage1WithStock" resultMap="goodsSpuMap5">
        SELECT
        <include refid="goodsSpuSql2"/>,
        sum(s.stock) as stock
        FROM goods_spu as goods_spu
        left join goods_sku as s on goods_spu.id=s.spu_id
        <where>
            <if test="query.shopId != null">
                AND goods_spu.`shop_id` = #{query.shopId}
            </if>
            <if test="query.shelf != null">
                AND goods_spu.`shelf` = #{query.shelf}
            </if>
            <if test="query.verifyStatus != null">
                AND goods_spu.`verify_status` = #{query.verifyStatus}
            </if>
            <if test="query.categorySecond != null">
                AND goods_spu.`category_second` = #{query.categorySecond}
            </if>
            <if test="query.name != null">
                AND goods_spu.`name` LIKE CONCAT('%',#{query.name},'%')
            </if>
            <if test="query.spuCode != null">
                AND goods_spu.`spu_code` = #{query.spuCode}
            </if>
            <if test="query.specType != null">
                AND goods_spu.`spec_type` = #{query.specType}
            </if>
            <if test="query.pointsGiveSwitch != null">
                AND goods_spu.`points_give_switch` = #{query.pointsGiveSwitch}
            </if>
            <if test="query.pointsDeductSwitch != null">
                AND goods_spu.`points_deduct_switch` = #{query.pointsDeductSwitch}
            </if>
        </where>
        group by goods_spu.id
    </select>

六、修复后的业务验证

经过测试验证,分页也能正常,而且模糊查询也顺利。

MybatisPlusException:Failed to process,Error SQL异常报错如何解决

七、分析错误原因

出现该问题的原因有两个

(1)对Mybatis的 where标签 和 if 标签不熟悉

where标签的三个特性:

where标签可以被解析为where 关键字只有if标签有内容的情况下才会插入where子句;第二,若子句的开通为 “AND” 或 “OR”,where标签会将它替换去除; (2)开发完成代码后,应该做回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。

以上就是“MybatisPlusException:Failed to process,Error SQL异常报错如何解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...