问题在于传递给查询的参数。
当你使用像
#{parameterName}
指定参数mybatis将其转换为jdbc参数占位符
?
然后按索引设置参数。对于这个查询:
select * from a where col = #{param}
mybatis生成的查询将是:
select * from a where col = ?
因为您引用了这样的参数:
select * from a where col = '#{param}'
生成的查询变为:
select * from a where col = '?'
JDBCAPI将其视为一个没有任何参数的查询,因此当MyBatis试图使用JDBC设置参数时
PreparedStatement
API错误是参数索引无效。
要解决此问题,请删除引号:
@Select("SELECT A.PERSON_ID,A.PERSON_ADDRESS, C.CUSTOMER_NAME," +
" B.CUSTOMER_DOB," +
" FROM PERSON A, CUSTOMER B, CUSTOMER_DETAILS C" +
" WHERE A.CUSTOMER_ID=C.CUSTOMER_ID" +
" AND A.CUSTOMER_ID=B.CUSTOMER_ID (+)" +
" AND C.PERSON_NAME=#{personName, jdbcType=VARCHAR, mode=IN, javaType=String}" +
" AND C.CUSTOMER_ID=#{customerID, jdbcType=VARCHAR, mode=IN, javaType=String}")