将数组值从 JPA/Hibernate 传递到 PostgreSQL
Pass array values to PostgreSQL from JPA/Hibernate
我尝试从 JPA/Hibernate 环境中将整数数组值传递给 plpgsql 存储过程。但我总是得到一个执行:function fn_test_array(bytea) does not exist.
我写了一个简短的演示应用程序来演示问题。
(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
提前感谢您的帮助。
很遗憾,我没有找到复杂的解决方案。但是,我用 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();
}
}
});
我尝试从 JPA/Hibernate 环境中将整数数组值传递给 plpgsql 存储过程。但我总是得到一个执行:function fn_test_array(bytea) does not exist.
我写了一个简短的演示应用程序来演示问题。 (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
提前感谢您的帮助。
很遗憾,我没有找到复杂的解决方案。但是,我用 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();
}
}
});