如何使用jpa将数组参数传递给postgresql函数?

时间:2014-09-04 06:52:32

标签: java hibernate postgresql jpa eclipselink

有人可以告诉我如何使用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;

由于

1 个答案:

答案 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;

这对我真的很好。