Mybatis中一條SQL使用兩個(gè)foreach的問題及解決
一條SQL使用兩個(gè)foreach的問題
未修改前的 SQL 語句
<select id="findQuestionType_3_correct" resultType="map"> SELECT q.`id`, q.`questionContent`, GROUP_CONCAT(o.`questionOption`) AS questionOptionList FROM `exam_question` q INNER JOIN `exam_question_option` o ON q.`id` = o.`questionId` WHERE q.`id` IN <foreach item="ids_1" collection="array" open="(" separator="," close=")" > #{ids_1} </foreach> AND q.`questionType` = 3 AND o.`correct` = 1 GROUP BY FIELD(q.`id`, <foreach item="ids_2" collection="array" separator="," > #{ids_2} </foreach> ) </select>
這里注意一個(gè)點(diǎn),我兩個(gè) foreach 的 collection 參數(shù)都是:array;
這在只有一個(gè) foreach 的情況下,代碼是能跑通的,沒錯(cuò)我后臺(tái)給的參數(shù)是一個(gè) int[];
因?yàn)闃I(yè)務(wù)需求,我又加了一個(gè) foreach,同樣, collection 參數(shù)給的還是:array;
但是,運(yùn)行時(shí)代碼就報(bào)錯(cuò)了,
報(bào)錯(cuò)如下
???啥情況,四個(gè)參數(shù)???我只給了兩個(gè)參數(shù)啊???SQL 兩個(gè)參數(shù),Dao 層我也沒給 4 個(gè)啊
這個(gè) array 參數(shù)是個(gè)什么鬼?
最后,差不多邊查邊改了兩個(gè)多小時(shí),發(fā)現(xiàn)問題;
將 foreach 的 collection 參數(shù)值分別改為對(duì)應(yīng)的 ids_1 和 ids_2,即可;
代碼如下:
<select id="findQuestionType_3_correct" resultType="map"> SELECT q.`id`, q.`questionContent`, GROUP_CONCAT(o.`questionOption`) AS questionOptionList FROM `exam_question` q INNER JOIN `exam_question_option` o ON q.`id` = o.`questionId` WHERE q.`id` IN <foreach item="ids_1" collection="ids_1" open="(" separator="," close=")" > #{ids_1} </foreach> AND q.`questionType` = 3 AND o.`correct` = 1 GROUP BY FIELD(q.`id`, <foreach item="ids_2" collection="ids_2" separator="," > #{ids_2} </foreach> ) </select>
跑是跑通了,但是這樣只是 知其然不知其所以然,于是我在網(wǎng)上查閱了下資料,果然:
當(dāng)查詢有多個(gè)參數(shù)時(shí),foreach 的 collection 屬性可以指定名稱;
查閱文章為:Mybatis List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)
foreach執(zhí)行多條sql報(bào)錯(cuò)的解決
今天在用mybatis執(zhí)行foreach更新操作時(shí)報(bào)了奇怪的錯(cuò)誤.sql語句是沒有任何問題的.sql拿出來直接能運(yùn)行.但是mybatis就是不能運(yùn)行.
而我傳遞一條數(shù)據(jù)的話mybatis能運(yùn)行,但是兩條以上數(shù)據(jù)就會(huì)報(bào)錯(cuò)
后來發(fā)現(xiàn)是mysql不支持執(zhí)行多條sql語句.為此需要再數(shù)據(jù)源后面加上一句話.就可以執(zhí)行多條sql了
&allowMultiQueries=true
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 基于mybatis注解動(dòng)態(tài)sql中foreach工具的方法
- mybatis 查詢sql中in條件用法詳解(foreach)
- Mybatis動(dòng)態(tài)SQL foreach標(biāo)簽用法實(shí)例
- MyBatis動(dòng)態(tài)SQL foreach標(biāo)簽實(shí)現(xiàn)批量插入的方法示例
- mybatis foreach批量插入數(shù)據(jù):Oracle與MySQL區(qū)別介紹
- Mybatis中動(dòng)態(tài)SQL,if,where,foreach的使用教程詳解
- Mybatis動(dòng)態(tài)SQL之if、choose、where、set、trim、foreach標(biāo)記實(shí)例詳解
- Mybatis動(dòng)態(tài)SQL?foreach批量操作方法
相關(guān)文章
SpringBoot集成redis實(shí)現(xiàn)分布式鎖的示例代碼
這篇文章主要介紹了SpringBoot集成redis實(shí)現(xiàn)分布式鎖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼)
這篇文章主要介紹了Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Spring通過配置文件和注解實(shí)現(xiàn)屬性賦值
這篇文章主要介紹了Spring通過配置文件和注解實(shí)現(xiàn)屬性賦值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot整合FTP實(shí)現(xiàn)文件傳輸?shù)牟襟E
這篇文章主要給大家介紹了SpringBoot整合FTP實(shí)現(xiàn)文件傳輸?shù)牟襟E,文中的流程步驟和代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-11-11如何在IDEA中對(duì) hashCode()和 equals() 利用快捷鍵快速進(jìn)行方法重寫
這篇文章主要介紹了如何在IDEA中對(duì) hashCode()和 equals() 利用快捷鍵快速進(jìn)行方法重寫,需要的朋友可以參考下2020-08-08