Code Bye

mybatis 的查询问题

急求大侠解决
小弟的项目使用mybatis,有一个sql使用 in查询 

 and     	tableName.CONTENT_ATTACHMENT_ID 
    in      	(#{contentAttachmentIdStr})

通过console输出的sql去数据库查询时返回两条记录 但是程序中却只返回了一条记录,请问该怎么解决啊

跟踪程序,看看in后面的内容
引用 1 楼 splendid_java 的回复:

跟踪程序,看看in后面的内容

debug跟踪了,是356,357(String),console 输出的

09:43:06,333 DEBUG queryListPage:46 - ==>  Preparing: select CONTENT_ATTACHMENT_ID, CONTENT_ID, CONTENT_ATTACHMENT_NAME, CONTENT_ATTACHMENT_TYPE, CONTENT_ATTACHMENT_LINK, CONTENT_ATTACHMENT_DESCRIPTION, CONTENT_SOFTWARE_PRODUCT_PLATFORM, CONTENT_VERSION, DOWNLOAD_TIMES, UPDATE_DATE, UPDATE_USER, INSERT_DATE, INSERT_USER, DEL_FLAG from bim_content_attachment where bim_content_attachment.DEL_FLAG = 0 and bim_content_attachment.CONTENT_ATTACHMENT_ID in (?) limit 0,10 
09:43:06,334 DEBUG queryListPage:46 - ==> Parameters: 356,357(String)

 拿这条语句去数据库执行了 确实能查询出来两条记录


20分
你穿进去的参数应该是这样的‘’,‘’,‘’,‘’而不应该是‘,,,,’
引用 3 楼 fangmingshijie 的回复:

你穿进去的参数应该是这样的‘’,‘’,‘’,‘’而不应该是‘,,,,’

debug看了contentAttachmentIdStr是“356,357”的

bim_content_attachment.CONTENT_ATTACHMENT_ID in (356,357),确定执行是这样?
你parametertype是啥,id集合数组?拼接id逗号分割字符串?我一般传list或数组,然后用foreach标签
引用 5 楼 splendid_java 的回复:

bim_content_attachment.CONTENT_ATTACHMENT_ID in (356,357),确定执行是这样?

我在程序xml的sql 直接这样写了

bim_content_attachment.CONTENT_ATTACHMENT_ID     in      	(356,357)

 这样程序就返回了两条

tableName.CONTENT_ATTACHMENT_ID 
    in          (#{contentAttachmentIdStr})有问题的
mybatis会把#{contentAttachmentldStr}会把#{}里面的东西看成一个字符串‘356,357’的
引用 7 楼 tjzero_sapce 的回复:
Quote: 引用 5 楼 splendid_java 的回复:

bim_content_attachment.CONTENT_ATTACHMENT_ID in (356,357),确定执行是这样?

我在程序xml的sql 直接这样写了

bim_content_attachment.CONTENT_ATTACHMENT_ID     in      	(356,357)

 这样程序就返回了两条

那就是mybatis执行时候,不是按这个处理的

引用 8 楼 xiao_feng68 的回复:

tableName.CONTENT_ATTACHMENT_ID 
    in          (#{contentAttachmentIdStr})有问题的
mybatis会把#{contentAttachmentldStr}会把#{}里面的东西看成一个字符串‘356,357’的

那我在后台组织这个字符串应该是什么样式的呢?

在调用SQL前打印contentAttachmentldStr,看看他是什么内容,然后等价替换#{contentAttachmentldStr},看看得到什么SQL
引用 11 楼 oh_Maxy 的回复:

在调用SQL前打印contentAttachmentldStr,看看他是什么内容,然后等价替换#{contentAttachmentldStr},看看得到什么SQL

 我试了下 因为我定义的contentAttachmentldStr是String 类型,CONTENT_ATTACHMENT_ID 是Long,所以程序自动为他加了引号 ,成了这样的
 

bim_content_attachment.CONTENT_ATTACHMENT_ID in (""356,357"")

  现在就是不知道该怎么来去掉两个单引号

估计是你resultMap写错了
引用 13 楼 whhmkj 的回复:

估计是你resultMap写错了

resultMap 没有错,返回了一条记录,不是两条

在传值前,就把单引号过滤掉
引用 12 楼 tjzero_sapce 的回复:
Quote: 引用 11 楼 oh_Maxy 的回复:

在调用SQL前打印contentAttachmentldStr,看看他是什么内容,然后等价替换#{contentAttachmentldStr},看看得到什么SQL

 我试了下 因为我定义的contentAttachmentldStr是String 类型,CONTENT_ATTACHMENT_ID 是Long,所以程序自动为他加了引号 ,成了这样的
 

bim_content_attachment.CONTENT_ATTACHMENT_ID in (""356,357"")

  现在就是不知道该怎么来去掉两个单引号

我觉得你应该拼成””356″”,””357″”才对吧?另外,传入map的时候,不可以指定类型的么

<![CDATA[。。。。。sql]]>

你sql加这个试试

看tableName.CONTENT_ATTACHMENT_ID 数据类型是什么,如果是数字,传 356,357,如果是字符,传””356″”,””357″”
正确方式:
select * from test where id in
<foreach collection=”list” item=”item” index=”index” separator=”,” open=”(” close=”)”>
          #{item}
</foreach>
我手写的,应该这样写的才对 list就是你的356,357 separator属性定义的”,”就是你传递到参数分割符。比如传递参数:356|357那么separator=”|”就可以了 

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mybatis 的查询问题