Scala结合Doobie:如何查询PostgreSQL的数组/JSONB列?
PostgreSQL数组列查询及Doobie实现方案
你当前的问题是用错了PostgreSQL数组的查询操作符——?是jsonb类型专属的操作符,不适用于text[]数组,所以代码没按预期生效。下面给你两种可行方案:
一、保留text[]数组类型的修复方案
PostgreSQL查询text[]数组包含指定元素,有两种常用写法:
1. 使用= ANY()操作符
这种写法直观易懂,直接判断目标值是否是数组中的任意元素:
def getPlayers(result: String): Query[Long] = { sql"select id from players where $result = ANY(results)".query[Long] }
注:原函数参数中的id在SQL里未用到,这里暂时移除;另外id字段是bigint类型,对应Scala的Long而非Int,要保证类型匹配。
2. 使用@>操作符
该操作符用于判断数组是否包含指定子数组,因此需要把参数包装成单元素数组:
def getPlayers(result: String): Query[Long] = { sql"select id from players where results @> ARRAY[$result]::text[]".query[Long] }
Doobie会自动处理参数绑定,无需额外编写类型转换代码。
二、换成jsonb类型的简化方案
如果换成jsonb数组类型(字段定义为results jsonb),确实能简化查询,也可以用你最初想的?操作符:
首先修改表结构:
create table if not exists players ( id bigint, name text, results jsonb );
然后对应的Doobie代码:
def getPlayers(result: String): Query[Long] = { sql"select id from players where results ? $result".query[Long] }
这种写法更符合你最初的预期,而且jsonb支持更复杂的查询(比如嵌套结构、路径查询),后续有扩展需求时灵活性更高。
内容的提问来源于stack exchange,提问作者Developus
相关产品推荐
相关产品推荐

