有人可以告诉我如何使用EclipseLink (jpa 2.1)
将数组参数传递给postgresql函数吗?
我尝试了以下但得到错误:
异常
org.postgresql.util.PSQLException:无法推断要用于的SQL类型 [Ljava.lang.Integer;的一个实例。使用带有显式的setObject() 键入值以指定要使用的类型。
Integer[] propertyRowIndexArr = new Integer[]{1005, 1006, 1007};
StoredProcedureQuery query1 = myEntityManager.createStoredProcedureQuery("func_testArr");
query1.registerStoredProcedureParameter("itemdetailid", Integer[].class, ParameterMode.IN);
query1.setParameter("itemdetailid", propertyRowIndexArr);
CREATE OR REPLACE FUNCTION func_testArr(categoryid integer[])
RETURNS setof category AS
$BODY$
DECLARE r category%rowtype;
BEGIN
FOR r IN select * from category c where c.categoryid = any($1)
LOOP
RETURN NEXT r;
END LOOP;
END;
由于
答案 0 :(得分:0)
我对此问题进行了解决。
我需要将二维字符串数组(String [] [])作为参数传递给PostgreSQL函数。
我所做的是将整个数组转换为字符串,然后将方括号替换为整个字符串中的花括号,如下所示:
query.setParameter(22, Arrays.deepToString(detalles_pedido).replace('[', '{').replace(']', '}'));
然后在我的PostgreSQL函数中,我将接收到的参数类型更改为TEXT,并且能够使用PostgreSQL函数中的 variableName :: TEXT [] [] 指令将文本转换为数组。< / p>
validacion := 0;
FOREACH detalle SLICE 1 IN ARRAY set_detalles::text[][] LOOP
oidDetalle = uuid_generate_v4();
SELECT "Oid" INTO productoID FROM public.cat_producto WHERE descripcion = detalle[1];
SELECT precio_unitario INTO precioUnitario FROM public.cat_producto WHERE descripcion = detalle[1];
SELECT count(dblink) INTO validacion FROM (SELECT dblink('dblink_trans', 'INSERT INTO public.detalle_pedido ("Oid", pedido_id , producto_id, cantidad, surtido, precio, "OptimisticLockField", "GCRecord") VALUES (''' || oidDetalle || ''',''' || Oid || ''',''' || productoID || ''', '|| detalle[2] || ', false,'|| precioUnitario || ', 0, null);')::TEXT) AS insercion;
END LOOP;
这对我真的很好。