Spring Data JPA 原生查询 - 如何将 Postgres ARRAY 类型用作参数

5

我有一个原生的PostgreSQL查询(选项为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,SQL状态:42883 h.e.j.s.SqlExceptionHelper - 错误:函数jsonb_exists_any(jsonb, record[])不存在

因为这个查询被转换成了:

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

有没有一种方法可以将参数作为数组传递?例如,不需要在 ?, ? 周围加上括号。


你解决了吗? - damike
@damike,我还没有找到比Soung的答案更好的。 - Oleksandr Lykhonosov
我昨天找到了一个解决方案:CREATE OR REPLACE FUNCTION wrap_varchar(VARIADIC params VARCHAR[]) RETURNS SETOF VARCHAR[] AS $$ SELECT params; $$ LANGUAGE SQL;然后SELECT jsonb_exists_any('{"name": "Joe Smith", "age": 28, "sports": ["football"]}', wrap_varchar('age','address'));这可以与Spring Data一起使用。您可以将'age','address'替换为:filter - damike
2个回答

6

你能试试这个吗:

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

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


2
是的,你的解决方案可行,但我想知道是否有一种选项可以在不将值转换和连接为字符串的情况下使用列表或数组。 - Oleksandr Lykhonosov

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接