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

时间:2018-10-27 14:05:51

标签: sql postgresql spring-boot jpa

伙计们,我在网上搜索了很多如何通过传递列表作为参数来调用PostgreSQL函数的方法。我的函数如下所示,它接收到Long(id)的列表,并且它将执行查询。如何在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;

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

@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 个答案:

答案 0 :(得分:0)

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

因此,您要创建的Integer列表,应该尝试为BigInteger或Long创建它。

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