如何通过JPA原生查询调用接收BIGINT[]参数的PostgreSQL函数
解决JPA原生查询调用PostgreSQL数组参数函数的问题
可行实现方案
下面两种方法都能正确传递PostgreSQL数组参数,解决你的调用问题:
方案1:通过CAST转换参数类型
在原生查询里用CAST把传入的集合转成PostgreSQL的BIGINT[]类型,同时用命名参数明确绑定:
Repository层代码:
@Query(nativeQuery = true, value = "SELECT * FROM public.func_anonymize_business(CAST(:businessIds AS BIGINT[]))") void deactivateAndAnonymizeBusiness(@Param("businessIds") List<Long> businessIds);
Service层直接用你原来的调用逻辑即可:
ArrayList<Long> ids = new ArrayList<>(); ids.add(businessId); businessRepository.deactivateAndAnonymizeBusiness(ids);
方案2:使用PostgreSQL数组构造语法
借助PostgreSQL的ARRAY[]构造函数,配合类型转换:
Repository层代码:
@Query(nativeQuery = true, value = "SELECT * FROM public.func_anonymize_business(ARRAY[:businessIds]::BIGINT[])") void deactivateAndAnonymizeBusiness(@Param("businessIds") List<Long> businessIds);
Service层调用同上。
原方式报错原因
- 方式一报错:传递
List<Long>时,JPA默认会把集合拆成多个独立参数,PostgreSQL收到的是单个bigint值而非数组,所以找不到对应签名的函数。 - 方式二报错:传递
Long[]数组时,JPA没有自动转成PostgreSQL数组类型,反而把它当作二进制数据(bytea)处理,导致函数匹配失败。
内容的提问来源于stack exchange,提问作者Mankind1023
相关产品推荐
相关产品推荐

