Mybatis異常解決之:java.sql.SQLException: Parameter index out of range
阿新 • • 發佈:2018-12-23
mybatis使用過程中遇到下面一個異常:
org.springframework.dao.TransientDataAccessResourceException: ### Error querying database. Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). ### The error may exist in conf/entitymap/diseaseMapper.xml ### The error may involve diseaseMapper.queryCountByName-Inline ### The error occurred while setting parameters ### SQL: select count(1) from tb_disease where 1=1 AND name like CONCAT('%','?','%') ### Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). ; SQL []; Parameter index out of range (1 > number of parameters, which is 0).; nested exception is java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) ~[spring-jdbc-3.2.9.RELEASE.jar:3.2.9.RELEASE] at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) ~[mybatis-spring-1.2.2.jar:1.2.2] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371) ~[mybatis-spring-1.2.2.jar:1.2.2] at com.sun.proxy.$Proxy70.selectOne(Unknown Source) ~[na:na] at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163) ~[mybatis-spring-1.2.2.jar:1.2.2]
根據錯誤資訊
select count(1) from tb_disease where 1=1 AND name like CONCAT('%','?','%')
找到相應配置如下,發現原來是#{diseaseName}用法有誤:CONCAT('%','#{diseaseName}','%')
mapper檔案配置如下:
select id="queryCountByName" resultType="java.lang.Long" parameterType="java.util.HashMap"> select count(1) from tb_disease where 1=1 <if test="diseaseName!=null and diseaseName!=''"> AND name like CONCAT('%','#{diseaseName}','%') </if> </select>
在mapper檔案中使用#佔位符傳參時,一定不要在兩側新增引號,否則會導致引數解析異常。
正確的配置方式應該是以下這樣:
<select id="queryCountByName" resultType="java.lang.Long" parameterType="java.util.HashMap"> select count(1) from tb_disease where 1=1 <if test="diseaseName!=null and diseaseName!=''"> AND name like CONCAT('%',#{diseaseName},'%') </if> </select>
另外,或者可以把#改成$,但是mapper檔案中使用$會有sql注入漏洞,所以不建議使用!