select
a.name,
a.salary,
${text} text
from table a
类似这种的sql,mybatis传递过来的text参数如果是单纯的一个字符串可以正常执行,
但是现在的问题是text里的参数为:('aaa','bbb','ccc')这样的格式。所以执行就非法了。
请问该怎么写呢。因为我级联查询,需要像其他mapper查询传递参数
'aaa','bbb','ccc'换成'aaa,bbb,ccc'
$ 换成 # 试一下
aaa','bbb','ccc'以集合的形式传,在xml用循环获取
这种传参的话,一般我们会使用 list/map/数组 来进行传参然后在 mapper 中使用foreach 循环来去 map 中的值来拼接,举个例子:
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
举个例子:
<!-- 动态foreach -->
SELECT * FROM USER
<!-- 自定义类List集合 变量 开始 结束 分割 -->
#{id}
<!-- and id in (1,10,16) -->
这样应该可以
这块我之前遇到过这样试试 加上单引号
如果需要在查询结果中输出"'a','b','c'"(不包含双引号),需要进行如下转义:
SELECT '\'a\',\'b\',\'c\'' text FROM DUAL;
题主在MyBatis映射文件中用了美元符号($),而美元符号取值时仅仅是替换原参数,不会做任何修改优化:
···
SELECT (${text}) text FROM DUAL;
···
传入"'a','b','c'"后变为:
···
SELECT ('a','b','c') text FROM DUAL;
···
这个SQL语句在加了括号的情况下会报错,括号去掉后又得不到想要的结果。
解决:
尝试把美元符号($)替换为井号(#),如果不行,那只能对参数中的单引号进行转义了。