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对象。

我们查询条件是providerID字段,我们要在providerid属性中查找而不是查找整个provider

四、解决办法

foreach标签中的id改为provider,将 #{id}改为#{provider.id}即可解决,如下:

<foreach collection="list" item="provider"
         open="(" separator="," close=")">
    #{provider.id}
</foreach>
posted @ 2024-09-26 21:21  安十  阅读(486)  评论(0)    收藏  举报