mybatis 数组array参数报错org.apache.ibatis.exceptions.PersistenceException: ### Error querying dat

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 数组array参数报错org.apache.ibatis.exceptions.PersistenceException: ### Error querying dat相关的知识,希望对你有一定的参考价值。

org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.ClassCastException: [I
### The error may exist in myBatis/userMapper.xml
### The error may involve com.dao.UserMapper.queryActiclesByArray
### The error occurred while executing a query
### Cause: java.lang.ClassCastException: [I
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:61)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:53)
at org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:82)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)
at $Proxy1.queryActiclesByArray(Unknown Source)
at com.test.MyBatisTest.dynamicForeachTest2(MyBatisTest.java:79)
at com.test.MyBatisTest.main(MyBatisTest.java:42)
Caused by: java.lang.ClassCastException: [I
at org.apache.ibatis.builder.xml.dynamic.ExpressionEvaluator.evaluateIterable(ExpressionEvaluator.java:29)
at org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode.apply(ForEachSqlNode.java:36)
at org.apache.ibatis.builder.xml.dynamic.MixedSqlNode.apply(MixedSqlNode.java:14)
at org.apache.ibatis.builder.xml.dynamic.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:22)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:198)
at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:119)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:88)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:72)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:59)
... 7 more
<select id="queryActiclesByArray" resultType="Article" >
select id,userid,title,content from article where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#item
</foreach>
</select>

mybatis 数组array参数报错,是设置错误造成的,解决方法如下:

1、首先使用数组前首先需要创建一个数组出来,并且初始化,对数组赋值。创建一个mybooks的数组,对数组进行赋值。

2、数组创建成功后,那么如何输出数组中的元素,需要使用 for...in 声明来循环输出数组中的元素。

3、访问页面,查看输出结果,正常输出,在这里顺便介绍一下javascript Array对象属性:constructor  描述:返回对创建此对象的数组函数的引用。

4、使用concat() 合并两个数组,继续刚才步骤1的代码进行完善,再声明一个数组,如图。

5、最后直接调用concat()方法,将两个数组合并,array.concat(array2);  如下。

参考技术A /**
 * 3个get方法,是从数据库中查数据时用的
 * 最后的set方法,是插入或修改数据时用的,需要重写一下构造器
 * SQL语句示例:
 * UPDATE tab SET col = #param, typeHandler=typeHandlerName
 **/
public class IntArrayTypeHandler extends BaseTypeHandler<Object> implements TypeHandler<Object> 
    @Override
    public int[] getNullableResult (ResultSet rs, String s) throws SQLException 
        Array a = rs.getArray (s);
        int[] intArray = null;

        if (a != null) 
            intArray = (int[]) a.getArray ();

            try 
                a.free ();
             catch (Exception e) 
            
        

        return intArray;
    

    @Override
    public int[] getNullableResult (ResultSet rs, int i) throws SQLException 
        Array a = rs.getArray (i);
        int[] intArray = null;

        if (a != null) 
            intArray = (int[]) a.getArray ();

            try 
                a.free ();
             catch (Exception e) 
            
        

        return intArray;
    

    @Override
    public int[] getNullableResult (CallableStatement callablestatement, int i) throws SQLException 
        Array a = callablestatement.getArray (i);
        int[] intArray = null;

        if (a != null) 
            intArray = (int[]) a.getArray ();

            try 
                a.free ();
             catch (Exception e) 
            
        

        return intArray;
    

    @Override
    public void setNonNullParameter (PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
            throws SQLException 
        if (parameter == null) 
            ps.setArray (i, null);
         else 
            @SuppressWarnings("unchecked")
            ArrayList<Object> intList = (ArrayList<Object>) parameter;

            Integer[] objectArray = new Integer[intList.size ()];

            for (int j = 0; j < intList.size (); j++) 
                objectArray[j] = Integer.parseInt (intList.get (j).toString ());
            

            Array array = ps.getConnection ().createArrayOf ("integer", objectArray);
            ps.setArray (i, array);
        
    

参考技术B array参数的类型是什么追问

inti[] arr

追答

这个写法没有问题的。

检查检查别名等的设置

追问

array需要设置别名吗,我使用List是可以成功查询的,我的提示的是Class类型转换错误,怎么我使用List时候就没这个错误呢

追答

resultType="Article"
有没有设置别名什么的。

追问

有的

mybatis仅传入一个String类型参数报错

  

  mybatis中仅传入一个String类型参数时,不可以用 以下方式

List<Map<String,Object> selectEmployee(String time)

这种方式传参会报错There is no getter for property named ‘id‘ in class ‘java.lang.String‘ 

目前我知道有两种方式解决问题

1.用 _parameter

<if test="_parameter !=null and _parameter !=‘‘">    
         DATE_FORMAT( dms.statistic_date, ‘%Y-%m‘ ) = #_parameter,jdbcType=VARCHAR
</if>

2.在mapper中参数加上@Param注解

List<Map<String,Object> selectEmployee(@param("time") String time)

 

以上是关于mybatis 数组array参数报错org.apache.ibatis.exceptions.PersistenceException: ### Error querying dat的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 集合、数组类型参数语法

mybatis数组和集合的长度判断及插入

Mybatis第三篇:参数解析

Mybatis实现批量删除

mybatis报错:java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and jav

Mybatis实现批量删除操作