当前位置: 首页 > 知识库问答 >
问题:

调用Postgresql函数,使用mybatis传递整数数组

陶法
2023-03-14

这可能是一个直接的问题,但我尝试了很多选择,但都不起作用。我给出了以下细节供大家参考。Mybatis xml配置:-

<select id="updateComps" statementType="CALLABLE" parameterType="java.util.List">
  <![CDATA[ {call vivo.select_workout (#{list, mode=IN, jdbcType=ARRAY})}]]>        
</select>

Postgres功能:-

CREATE OR REPLACE FUNCTION vivo.delete_completed_activity_logged_workout(INT[])
    RETURNS integer
 LANGUAGE plpgsql
AS $function$
declare
ids ALIAS FOR $1;
dist BIGINT[];

映射器配置:-

void deleteCompletedActivityRecords(List<Integer> users);

错误面对:-

aused:org.apache.ibatis.type.TypeException:使用JdbcType数组为参数#1设置非空时出错。尝试为此参数设置不同的JdbcType或不同的配置属性。原因:java.lang.ClassCastException:java.util.Arrays$ArrayList无法转换为org.apache.ibatis.type.baseTypeHandler.setParameter(baseTypeHandler.java:55)(org.apache.ibatis.scripting.defaults.defaults.defaultparameter.setParameters(defaultparameter.java:87)...68更多原因:java.lang.ClassCastException:java.util.Arrays$ArrayList无法转换为.原因:org.apache.ibatis.type.TypeException:使用JdbcType数组为参数#1设置非空时出错。尝试为此参数设置不同的JdbcType或不同的配置属性。原因:java.lang.ClassCastException:java.util.Arrays$ArrayList不能强制转换为java.sql.Array

共有1个答案

董永宁
2023-03-14

我创建了以下自定义ArrayTypeHandler。

package com.lf.util;

import com.google.common.collect.Lists;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.JdbcType;

import java.sql.*;
import java.util.List;

@MappedJdbcTypes(JdbcType.ARRAY)
public class CustomArrayTypeHandler extends BaseTypeHandler<List<Long>> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<Long> parameter, JdbcType jdbcType) throws SQLException {
        Array array = ps.getConnection().createArrayOf("integer", parameter.toArray());
        ps.setArray(i, array);
    }

    @Override
    public List<Long> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return toList(rs.getArray(columnName));
    }

    @Override
    public List<Long> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return toList(rs.getArray(columnIndex));
    }

    @Override
    public List<Long> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return toList(cs.getArray(columnIndex));
    }

    private List<Long> toList(Array pgArray) throws SQLException {
        if (pgArray == null) return Lists.newArrayList();

        Long[] strings = (Long[]) pgArray.getArray();
        return containsOnlyNulls(strings) ? Lists.<Long>newArrayList() : Lists.newArrayList(strings);
    }

    private boolean containsOnlyNulls(Long[] strings) {
        for (Long s : strings) {
            if (s != null) {
                return false;
            }
        }
        return true;
    }
}

并且在xml文件中:

<select id="deleteRecords" statementType="CALLABLE" resultType="java.lang.Integer" parameterType="java.util.List">
        <![CDATA[ {call vivo.delete_records (#{list, mode=IN, typeHandler=com.lf.util.CustomArrayTypeHandler})}]]>
    </select>
 类似资料:
  • 有人能告诉我如何使用将数组参数传递给postgresql函数吗?我尝试了下面的方法,但是得到了错误: 例外 psqlException:无法推断用于[ljava.lang.Integer;]实例的SQL类型。使用带有显式Types值的setObject()来指定要使用的类型。 谢谢

  • 本文向大家介绍Mybatis调用PostgreSQL存储过程实现数组入参传递,包括了Mybatis调用PostgreSQL存储过程实现数组入参传递的使用技巧和注意事项,需要的朋友参考一下 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: 如上所示,参数是一个int数组,

  • 本文向大家介绍JavaScript函数的调用以及参数传递,包括了JavaScript函数的调用以及参数传递的使用技巧和注意事项,需要的朋友参考一下 JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同方式在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 Note 注意 this 是保留关键

  • 我有一个函数,它在PL/SQL中返回一个布尔值。我曾尝试直接获取那个布尔值,但没有成功,所以现在我试图将其转换为字符串(我不想修改数据库): 此代码在数据库中正常工作:

  • 陈述 我想去 但是显然没有使用...因为它不是切肉刀,我想了解更多关于函数及其传递参数的方式。 所以我尝试附加一个使用map函数列表的所有元素。但在此之前,是一个方法,而不是一个方法。 最后一个映射函数返回TypeError: 我想知道是否可以将参数传递给使用的方法。感谢

  • 我试图使用MyBatis从包含整数的表中获取单个列。我假设将其提取为一个列表(尽管在这一点上我可能错了!) 这是我的mapper.xml 这是我的映射器界面 我的DAO: 我如何称呼它: MyBatis似乎正在创建我期望的SELECT查询: 当我运行它时,我得到了这个: 我敢肯定我在做一些非常愚蠢的事情!