mybatis报错:jdbcType (null) combination.
一、报错
报错提示:It was either not specified and/or could not be found for the javaType (com.smbms.pojo.Provider) : jdbcType (null) combination.
Caused by: java.lang.IllegalStateException: Type handler was null on parameter mapping for property '__frch_provider_0'. It was either not specified and/or could not be found for the javaType (com.smbms.pojo.Provider) : jdbcType (null) combination.
at org.apache.ibatis.mapping.ParameterMapping$Builder.validate(ParameterMapping.java:119)
at org.apache.ibatis.mapping.ParameterMapping$Builder.build(ParameterMapping.java:104)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:123)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:67)
at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:77)
at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:45)
at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:42)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:297)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
... 31 more
二、相关代码
接口:
package com.smbms.dao;
import com.smbms.pojo.Bill;
import com.smbms.pojo.Provider;
import java.util.List;
public interface BillMapper {
List<Bill> getBillbyProvider(List<Provider>providers);
}
实现:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smbms.dao.BillMapper">
<select id="getBillbyProvider" resultType="com.smbms.pojo.Bill" parameterType="com.smbms.pojo.Provider">
/*select * from smbms.smbms_bill where providerId in*/
select * from smbms.smbms_bill where providerId in
<foreach collection="list" item="id"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>
测试:
import com.smbms.dao.BillMapper;
import com.smbms.pojo.Bill;
import com.smbms.pojo.Provider;
import com.smbms.utils.MybatisUntils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class BillTest {
@Test
public void getBillList()
{
SqlSession sqlSession = MybatisUntils.getSqlSession();
BillMapper billMapper=sqlSession.getMapper(BillMapper.class);
Provider p1 = new Provider();
p1.setId(1);
Provider p2 = new Provider();
p2.setId(2);
List<Provider> list1=new ArrayList<Provider>();
list1.add(p1);
list1.add(p2);
System.out.println(list1);
List<Bill> list=billMapper.getBillbyProvider(list1);
for (Bill b:list)
{
System.out.println(b);
}
}
}
三、错误原因
在实现中,#{id}中并没有直接取到类的属性id。此id是参数List<provider>中的类型,即是一个provider对象。
我们查询条件是provider的ID字段,我们要在provider的id属性中查找而不是查找整个provider类
四、解决办法
将foreach标签中的id改为provider,将 #{id}改为#{provider.id}即可解决,如下:
<foreach collection="list" item="provider"
open="(" separator="," close=")">
#{provider.id}
</foreach>

浙公网安备 33010602011771号