ibatis list 作入参的一些问题

原贴:http://trinea.iteye.com/blog/1343269

ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用
Java代码 收藏代码

(List<Integer>)getSqlMapClientTemplate().queryForList("sqlName", paraName);

并经类型转换即可,做入参还需要稍微调整下,本文主要讲list做入参碰到的几个小问题



做入参主要有两种方法一种是以list直接作为入参,另一种是将list作为map的元素之一为入参,个人觉得第一种明显优势,就一个list为入参,还用map包装一层多蛋疼。下面的介绍都以这个sql为例
Java代码 收藏代码

<select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"
parameterClass="java.util.ArrayList">
<![CDATA[
SELECT id
FROM cic_job
WHERE last_buildid <> 'NULL'
]]>
<iterate prepend="AND" open="(" close=")" conjunction="or">
CRID=#projectIdList[]#
</iterate>
</select>

以上是正确的写法,意义大家不用关注,重点放在倒数2到4行,表示以list为入参,其中projectIdList为dao层传入的参数名。主要写法就是parameterClass="java.util.ArrayList",然后加上
Java代码 收藏代码

<iterate prepend="AND" open="(" close=")" conjunction="or">
CRID=#projectIdList[]#
</iterate>

意思就是迭代器循环projectIdList,并用or拼接形成sql,拼接完后用()括起来,在加上前缀and



1、iterate property的问题

网上很多写法是
Java代码 收藏代码

<iterate property="projectIdList" prepend="AND" open="(" close=")" conjunction="or">

即多了一个property,这个时候ibatis会从参数中寻找属性为projectIdList的对象,而list是一个对象没有属性就会报
Xml代码 收藏代码

Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1

异常,解决方法就是去掉property="projectIdList"

其实这种写法是相对第二种以map为参数而言的,你可以使用map传入参数设置属性为 property对应名即可



2、<![CDATA[的问题

大家注意到上面sql添加有<![CDATA[ ]]>,它的作用是对一些字符进行转移,具体可以参见http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html

但上面sql如果写成
Sql代码 收藏代码

<select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"
parameterClass="java.util.ArrayList">
<![CDATA[
SELECT id
FROM cic_job
WHERE last_buildid <> 'NULL'
<iterate prepend="AND" open="(" close=")" conjunction="or">
CRID=#projectIdList[]#
</iterate>
]]>
</select>

即扩大转义范围会出现如下错误
Xml代码 收藏代码

com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'

解决方法,就是缩小 CDATA的范围。原因是CDATA导致系统无法识别动态判断部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值