MybatisPlusException:Failed?to?process,Error?SQL異常報(bào)錯(cuò)的解決辦法
一、問(wèn)題描述
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>)
二、需求描述
運(yùn)營(yíng)提出,對(duì)首頁(yè)進(jìn)行店鋪裝修時(shí),需看到庫(kù)存字段,
這樣不會(huì)上到了0庫(kù)存的品,導(dǎo)致了用戶下單體驗(yàn)的問(wèn)題。
因此,在Mybatis Plus中新增了庫(kù)存字段以展示
三、定位錯(cuò)誤代碼
因?yàn)樵瓉?lái)這個(gè)接口是是做了一個(gè)基于Mybatis Plus的分頁(yè),但是因?yàn)閹?kù)存這個(gè)字段,存在sku的表中
因此使用left join ,但是又因?yàn)镾PU與SKU之間是一對(duì)多的關(guān)系,因此會(huì)有多個(gè)0庫(kù)存的情況,
這里采用了count進(jìn)行加和的方式,不得不說(shuō),設(shè)計(jì)的非常巧妙,因?yàn)榧雍推饋?lái)庫(kù)存都為0的話,說(shuō)明肯定是0庫(kù)存的呀。
因此有了以下代碼
<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>
以下代碼看起來(lái),沒(méi)有問(wèn)題,但是確有一個(gè)問(wèn)題,注意在,存在一個(gè)分號(hào),
我們都知道,分號(hào)是一段SQL語(yǔ)句的結(jié)尾,所以,
以上代碼肯定是后面的語(yǔ)句肯定是執(zhí)行不到的
但是到底是group by 語(yǔ)句放在前面呢?還是where 語(yǔ)句在前,這個(gè)問(wèn)題,可以直接在數(shù)據(jù)庫(kù)驗(yàn)證下即可
四、數(shù)據(jù)庫(kù)驗(yàn)證
寫(xiě)法一: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
發(fā)現(xiàn),數(shù)據(jù)能夠正常查詢
寫(xiě)法二:GROUP BY在前,WHERE在后
會(huì)發(fā)現(xiàn)無(wú)法正常查詢出來(lái)結(jié)果
五、修改Mybatis中的SQL語(yǔ)句
經(jīng)過(guò)以上的驗(yàn)證,得到了最終修改之后的SQL語(yǔ)句如下
<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>
六、修復(fù)后的業(yè)務(wù)驗(yàn)證
經(jīng)過(guò)測(cè)試驗(yàn)證,分頁(yè)也能正常,而且模糊查詢也順利。
七、分析錯(cuò)誤原因
出現(xiàn)該問(wèn)題的原因有兩個(gè)
(1)對(duì)Mybatis的 where標(biāo)簽 和 if 標(biāo)簽不熟悉
where標(biāo)簽的三個(gè)特性:
where標(biāo)簽可以被解析為where 關(guān)鍵字只有if標(biāo)簽有內(nèi)容的情況下才會(huì)插入where子句;第二,若子句的開(kāi)通為 “AND” 或 “OR”,where標(biāo)簽會(huì)將它替換去除; (2)開(kāi)發(fā)完成代碼后,應(yīng)該做回歸測(cè)試
回歸測(cè)試是指修改了舊代碼后,重新進(jìn)行測(cè)試以確認(rèn)修改沒(méi)有引入新的錯(cuò)誤或?qū)е缕渌a產(chǎn)生錯(cuò)誤。
總結(jié)
到此這篇關(guān)于MybatisPlusException:Failed to process,Error SQL異常報(bào)錯(cuò)解決的文章就介紹到這了,更多相關(guān)MybatisPlusException:Failed to process,Error SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目實(shí)現(xiàn)分布式日志鏈路追蹤
這篇文章主要給大家介紹了Spring Boot項(xiàng)目如何實(shí)現(xiàn)分布式日志鏈路追蹤,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07關(guān)于Java中Object類(lèi)的幾個(gè)方法示例
這篇文章主要給大家介紹了關(guān)于Java中Object類(lèi)的幾個(gè)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05IntelliJ IDEA 無(wú)法正常使用SVN的問(wèn)題和完美解決辦法
這篇文章主要介紹了IntelliJ IDEA 無(wú)法正常使用SVN的問(wèn)題和解決辦法,本文給大家分享完美解決方案,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Java如何將int型數(shù)組轉(zhuǎn)為String型數(shù)組
這篇文章主要介紹了Java如何將int型數(shù)組轉(zhuǎn)為String型數(shù)組,本文給大家分享具體實(shí)現(xiàn)思路結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03mybatis中mapper.xml文件的常用屬性及標(biāo)簽講解
這篇文章主要介紹了mybatis中mapper.xml文件的常用屬性及標(biāo)簽講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09