iBatis使用parameterMap时的Parameter index out of range错误

    先说下应用背景,我想实现一个小小的搜索,从MySQL数据库里面对三个字段进行模糊查询然后使用limit得到指定的记录数。

    我最初的做法是在DaoImpl里面创建一个Map,里面包含有查询需要的searchValue,start,number三个值,然后在SqlMap里面创建一个parameterMap对应前面的Map,再在<select/>里面使用这三个参数。实现主要代码如下:

调用sqlmap的java代码:

Map map = new HashMap();
		map.put("value", searchValue);
		map.put("start", start);
		map.put("number", number);
		System.out.println(map.get("value") + "," + map.get("start") + "," + map.get("number"));
		return (List<Works>) getSqlMapClientTemplate().queryForList(
				"Works.getPageSearchWorks", map);

SqlMap里面与该查询相关的代码:

<parameterMap class="java.util.HashMap" id="searchMap">
	<parameter property="value"/>
	<parameter property="start"/>
	<parameter property="number"/>
</parameterMap>
	
<select id="Works.getPageSearchWorks" parameterMap="searchMap" resultMap="worksResultMap">
	select * from works where title like '%$value$%'
	or tag like '%$value$%' or description like '%$value$%'
	limit #start#,#number#
</select>

  worksResultMap已经在前面定义了,并且该SqlMap里面还有很多个其他的<select/><delete/><update/>,都可以正常执行。

    然后写了个jUnit方法进行测试,失败,错误提示如下:

org.springframework.dao.TransientDataAccessResourceException: SqlMapClient operation; SQL [];   

--- The error occurred in WorksSqlMap.xml.  

--- The error occurred while applying a parameter map.  

--- Check the Works.searchMap.  

--- Check the parameter mapping for the 'value' property.  

--- Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   

--- The error occurred in WorksSqlMap.xml.  

--- The error occurred while applying a parameter map.  

--- Check the Works.searchMap.  

--- Check the parameter mapping for the 'value' property.  

--- Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

 

    其中那句“Parameter index out of rang”怎么都没弄明白。开始我以为是我的<select/>语句写错了,于是把那条语句分成两部分,一部分只做模糊查询,一部分只做limit操作,确认都可以正常运行,没有问题。

    按照前面这句错误提示,应该是自己写的parameterMap没法被SqlMap识别了,但我怎么都没有想清楚原因。。。后来在某人的博客上发现了同样的问题,他的解决方法是把parameterMap改成parameterClass,里面也没有写什么原因。本来我也以为这样应该是没什么用的,但后来在某位网友的影响下,我抱着试试看的心态把代码修改了一下,结果真的把这个问题解决了。。。可我依然没有想清楚是什么原因。。。。把官方文档拿出来又找着看了下,也没发现parameterMap跟parameterClass有什么大的差别。。。。

修改之后的SqlMap代码:

<select id="Works.getPageSearchWorks" parameterClass="ren.dvsky.domain.SearchBean" resultMap="worksResultMap">
	select * from works where title like '%$value$%'
	or tag like '%$value$%' or description like '%$value$%'
	limit #start#,#number#
</select>
 期待有高手能够帮我解释下这其中到底是什么原因。。。。

 

 

 

 

你可能感兴趣的:(DAO,sql,mysql,ibatis,JUnit)