【问题标题】:how to pass an array parameter using jpa to a postgresql function?如何使用 jpa 将数组参数传递给 postgresql 函数?
【发布时间】:2023-03-28 11:37:01
【问题描述】:

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

谢谢

【问题讨论】:

  • Thisthis 可能会对您有所帮助。
  • 感谢@ankur,链接已满。
  • 这是否解决了您的问题,那么我应该将其发布为您接受的答案
  • 是的。它给了我一个想法。我没有将数组传递给函数,而是传递了一个字符串并用逗号分隔整数。然后,我在函数内部使用 string_to_array 将字符串拆分为一个数组。谢谢,
  • 已发布答案供您接受

标签: java hibernate postgresql jpa eclipselink


【解决方案1】:

我解决了这个问题。

我需要将二维字符串数组 (String[][]) 作为参数传递给 PostgreSQL 函数。

我所做的是将整个数组转换为字符串,然后将方括号替换为完整字符串中的大括号,如下所示:

  query.setParameter(22, Arrays.deepToString(detalles_pedido).replace('[', '{').replace(']', '}')); 

然后在我的 PostgreSQL 函数中,我将接收到的参数类型更改为 TEXT,并且我能够使用 PostgreSQL 函数中的这条指令 variableName::TEXT[ ][ ] 将文本转换为数组。

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;

这对我来说真的很有效。

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2019-04-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多