Spring Data JPA Native Query - 如何使用Postgres ARRAY类型作为参数

问题描述 投票:0回答:3

我有一个本机 postgresql 查询(opts - jsonb 数组):

select * from table users jsonb_exists_any(opts, ARRAY['CASH', 'CARD']);

它在我的数据库控制台中运行良好,我得到了结果:

user1, ['CASH','CARD']
user2, ['CASH']
user3, ['CARD']

但是当我想在我的 spring data jpa 应用程序中使用它时:

@Query(value = "select * from users where jsonb_exists_any(opts, ARRAY[?1])", nativeQuery = true)
List<Users> findUsers(Set<String> opts);

我收到错误:

h.e.j.s.SqlExceptionHelper - SQL 错误:0,SQLState:42883 h.e.j.s.SqlExceptionHelper - 错误:函数 jsonb_exists_any(jsonb, 记录[])不存在

因为该查询转换为:

select
    * 
from
    users 
where
    jsonb_exists_any(opts, ARRAY[(?, ?)])

有没有办法将参数作为数组传递?即

?, ?

周围没有括号
sql postgresql spring-data-jpa jsonb
3个回答
6
投票

你能试试这个吗:

@Query(value = "select * from users where jsonb_exists_any(opts, string_to_array(?1, ','))", nativeQuery = true)
List<Users> findUsers(String listStringSeparatedByComma);

请注意,您必须将 Set 参数替换为字符串。


0
投票

这会起作用:

@Query(value = "with array_query as (select array_agg(value) as array_value from (select (json_each_text(row_to_json(row_values))).value from (values ?1) row_values) col_values)"+
" select * from users where jsonb_exists_any(opts, (select array_value from array_query))", nativeQuery = true)
List<Users> findUsers(Set<String> opts);

0
投票

我在 Spring Data 中使用

jsonb_exists_any
函数时遇到了同样的问题。 为了避免额外的括号 ARRAY[(?, ?)] 我更改了方法签名以接受 String[] 而不是 Set 或任何 Collection:

@Query(value = "select * from users where jsonb_exists_any(opts, :values)", nativeQuery = true)
List<Users> findUsers(@Param("values") String[] values);

并在Service层添加了数组转换:

// Set<String> opts = Set.of("a","b","c");
repository.findUsers(opts.toArray());

一旦它是数组,您就可以应用任何其他功能,例如仅当数组不为空时才使用过滤器:

@Query(value = "select * from users 
                where (array_length(:values, 1) is null or 
                jsonb_exists_any(opts, :values))"
© www.soinside.com 2019 - 2024. All rights reserved.