sql - 将数组传递给 PostgreSQL PL/pgSQL 函数
问题描述
伙计们,我在网上搜索了很多如何通过将列表作为参数传递来调用 PostgreSQL 函数。我的函数如下所示,它接收到一个 Long (ids) 列表,它将执行查询。如何在 JPA 中调用此函数?将 Long 列表作为参数传递?请帮忙,我想要的很简单,只需调用接收参数列表的函数,用JPA传递参数。
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
解决方案
在您的错误 ERROR: function public.fngetempresasfornecembemmaterial(bytea) does not exist the function is being passed bytea not bigint[]
因此,您正在创建的 Integer 列表,您应该尝试为 BigInteger 或 Long 创建它。
List<BigInteger> l = new ArrayList<BigInteger>();
推荐阅读
- javascript - 使用 Node Media Server 将 IP cam 中的 RTSP 重新流式传输到 http/ws 并使用 html 显示
- json - JPA 序列化实体
- definition - 信息密度的定义
- c# - 这行与数组相关的特定 C# 代码在做什么?
- java - 如何添加带有约束 onClick 的 EditText
- r - 如何在timevis中显示全部内容?
- svg - 调整字体大小,以便始终显示文本
- assembly - 带有 cmpsb 的 Intel x86 中的 strcmp
- apache-kafka - 为什么 KafkaMessageListenerContainer 从不放弃执行程序的线程?
- oracle - 如何在 Oracle Apex 中显示选择列表的默认值