PostgreSQL报错uuid=uuid[]不存在:如何给查询传递UUID数组参数?
问题根因
- 你传入的
uuids是List<UUID>类型的数组参数,但SQL中使用的IN运算符默认期望接收逗号分隔的离散值列表,而非数组类型对象。JDBC驱动会将你传入的List整体序列化为单个UUID数组类型值,最终执行的SQL实际为uuid in (ARRAY['uuid1','uuid2'...]),相当于将单个uuid字段与整个UUID数组做相等比较,因此触发operator does not exist: uuid = uuid[]的类型匹配错误。
解决方案
方案1:使用ANY运算符适配数组参数(推荐)
PostgreSQL原生支持通过ANY()函数匹配数组内的任意值,仅需修改SQL的WHERE条件,无需调整传参逻辑,改造成本最低且性能不受影响:
将原有SQL中的where uuid in (:uuids)修改为where uuid = ANY(:uuids)即可。
修改后的完整代码示例:
private fun generateSQLForTuples(tuplesList: List<List<String>>):String = // language=PostgreSQL """ select id, subcustomer from customer where uuid = ANY(:uuids) union select id, subcustomer from customer where (customer_id, subcustomer) in (${toJdbcTuples(tuplesList)}) """.trimIndent()
方案2:展开数组为离散占位符
如果你使用的数据库框架不支持数组参数绑定,也可以将UUID列表展开为多个独立的占位符,例如存在3个UUID时生成in (:uuid1, :uuid2, :uuid3)的SQL结构,再将每个UUID作为独立参数传递。该方案的缺点是当UUID数量较多时会导致SQL语句过长,性能低于方案1。
内容的提问来源于stack exchange,提问作者Leff
相关产品推荐
相关产品推荐

