Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数组值从JPA/Hibernate传递给PostgreSQL_Java_Postgresql_Hibernate_Jpa_Stored Functions - Fatal编程技术网

Java 将数组值从JPA/Hibernate传递给PostgreSQL

Java 将数组值从JPA/Hibernate传递给PostgreSQL,java,postgresql,hibernate,jpa,stored-functions,Java,Postgresql,Hibernate,Jpa,Stored Functions,我尝试从JPA/Hibernate环境向plpgsql存储过程传递整数数组值。但我总是得到一个执行:函数fn_test_array(bytea)不存在 我编写了一个简短的演示应用程序,演示了这个问题。 (Wildfly AS,JPA/Hibernate,PostgreSQL 12) 是的,我知道,int[].类是一个垃圾,但是解决方案是什么呢?:) 存储过程: CREATE OR REPLACE FUNCTION public.fn_test_array(in_arr integer[], OU

我尝试从JPA/Hibernate环境向plpgsql存储过程传递整数数组值。但我总是得到一个执行:函数fn_test_array(bytea)不存在

我编写了一个简短的演示应用程序,演示了这个问题。 (Wildfly AS,JPA/Hibernate,PostgreSQL 12)

是的,我知道,int[].类是一个垃圾,但是解决方案是什么呢?:)

存储过程:

CREATE OR REPLACE FUNCTION public.fn_test_array(in_arr integer[], OUT res_int bigint)
RETURNS bigint
LANGUAGE plpgsql
AS $function$
BEGIN

res_int := 201;
 
END;
$function$
;
来自java的调用:

StoredProcedureQuery query2 = em.createStoredProcedureQuery("fn_test_array")
.registerStoredProcedureParameter("in_arr", int[].class, ParameterMode.IN)
.registerStoredProcedureParameter("res_int", Long.class, ParameterMode.OUT)
.setParameter("in_arr", new int[]{1, 2});

query2.execute();
Long res2 = (Long) query2.getOutputParameterValue("res_int");
System.out.println("res2: " + res2);
例外情况:

11:26:11,933 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-19) SQL Error: 0, SQLState: 42883
11:26:11,933 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-19) ERROR: function fn_test_array(bytea) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 15

提前感谢您的帮助。

不幸的是,我没有找到成熟的解决方案。然而,我使用JDBC连接来实现它。它是这样工作的

final Session session = em.unwrap(Session.class);  //Hibernate session
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        try {
            String query = "{CALL fn_test_array(?, ?)}";
            CallableStatement stmt = connection.prepareCall(query);
            
            Integer[] numbers = {1, 2, 3, 5};
            final Array in_arr = connection.createArrayOf("integer", numbers);            
            stmt.setArray(1, in_arr);            
            stmt.registerOutParameter(2, Types.BIGINT);
            stmt.execute();

            Long resLong = stmt.getLong(2);
            System.out.println("resLong: " + resLong);
            stmt.close();            
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
});

因此,您可以将其作为一个字符串传递,并用“逗号或管道”连接,然后在postgres函数/过程中将该值拆分为一个数组。请问如何使用JpaRepository方法?