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

Posted

技术标签:

【中文标题】将数组值从 JPA/Hibernate 传递给 PostgreSQL【英文标题】:Pass array values to PostgreSQL from JPA/Hibernate 【发布时间】:2020-09-09 09:05:25 【问题描述】:

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

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

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

存储过程:

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

提前感谢您的帮助。

【问题讨论】:

因此您可以将其作为与“逗号或管道”连接的值字符串传递,并将值拆分为 postgres 函数/过程中的数组 【参考方案1】:

不幸的是,我没有找到巧妙的解决方案。但是,我使用 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();
        
    
);

【讨论】:

请问使用JpaRepository方法怎么样?

以上是关于将数组值从 JPA/Hibernate 传递给 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

将数组值从html传递到javascript

如何将值从 v-select 传递给方法 - 它始终与默认值相同

将值从向量分配给动态数组(C++)

如何使用 ajax 传递 from.serialize() 和数组值?

如何将 LocalDateTime 提供给 jpa/hibernate 查询?

如何将值从javascript变量传递给剃刀变量?