You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:45:02