将数组传递给 PostgreSQL PL/pgSQL 函数

Posted

技术标签:

【中文标题】将数组传递给 PostgreSQL PL/pgSQL 函数【英文标题】:Passing Arrays to a PostgreSQL PL/pgSQL Function 【发布时间】:2019-04-01 00:53:09 【问题描述】:

伙计们,我在网上搜索了很多如何通过将列表作为参数传递来调用 PostgreSQL 函数。我的函数如下所示,它接收到一个 Long (ids) 列表,它将执行查询。如何在 JPA 中调用此函数?将 Long 列表作为参数传递?请帮忙,我想要的很简单,只需调用接收参数列表的函数,用JPA传递参数。

Passing Arrays to a PostgreSQL function

 CREATE OR REPLACE FUNCTION public.fngetempresasfornecembemmaterial(bens_materias bigint[])
  RETURNS SETOF empresa AS
$BODY$
BEGIN
RETURN QUERY
    SELECT * FROM empresa WHERE id IN (
        SELECT empresa_id FROM empresa_bens_materias
        WHERE bem_material_id = ANY(bens_materias)
    );
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

这是我尝试调用将数组作为参数传递的函数的测试。

@Test
public void testGetEmpresaByCombineEdital() 
        Query q = em.createNativeQuery("SELECT * FROM public.fngetempresasfornecembemmaterial(:ids)");
        List<Integer> l = new ArrayList();
        l.add(1);
        l.add(4);
        q.setParameter("ids", l.toArray());
        q.getResultList().forEach(System.out::println);

我也得到了这个控制台输出:

Hibernate: 
    SELECT
        * 
    FROM
        public.fngetempresasfornecembemmaterial(?)
2018-10-27 10:50:30.803  WARN 25969 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42883
2018-10-27 10:50:30.803 ERROR 25969 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: function public.fngetempresasfornecembemmaterial(bytea) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 15

【问题讨论】:

【参考方案1】:

在您的错误错误中:函数 public.fngetempresasfornecembemmaterial(bytea) 不存在 该函数正在传递 bytea 而不是 bigint[]

所以您正在创建的 Integer 列表,您应该尝试为 BigInteger 或 Long 创建它。

List<BigInteger> l = new ArrayList<BigInteger>();

【讨论】:

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

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

将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素

在 Java 中创建一个 bytea 数组以传递给 Postgresql 存储过程

如何将值的“数组”传递给我的存储过程?

将表传递给 postgreSQL 函数,执行 select 语句,返回表

出现错误,org.postgresql.util.PSQLException: ERROR: syntax error at or near "." ,当尝试将列表传递给休眠中的新