如何在参数化 select 查询 where IN 子句中传递逗号分隔的 UUID

how to pass comma seperated UUID in parameterized select query where IN clause

我有一个以 UUID 作为键的 table 并且想使用 select 查询获取多行,所以查询如下:

select * from table1 where ids in (:commaseperatedUUIDs); //DB is postgreSql

我正在 Java 代码中尝试它,我有 List<UUID> 其中包含所有 UUID,但如果我通过使用字符串操作将其逗号分隔并将查询中的字符串作为参数传递然后它抛出 SQL 异常说明

operator does not exist: uuid = character varying

有什么线索吗?

我也不了解 Postgres,但我可以看到这里的问题。您的代码计算结果为 select * from table1 where ids in ('abc,bcd,dbc') 而不是 select * from table1 where ids in (abc,bcd,dbc).

您可以像这样构建命令:

sql = "select * from table1 where ids in (";
for (int i = 0; i < ids.length; i++) 
   if (i == 0)
       sql += "?"
   else 
       sql += ",?";

sql += ")";

PreparedStatement ps = connection.prepareStatement(sql);
for (int i = 0; i < ids.length; i++)
    // replace the XXX with a valid type for UUID, I don't know what type to use
    ps.setXXX(i+1, ids[i]);

如果您使用 Spring,那么您可以利用命名参数支持并将 :commaseperatedUUIDs 的值作为 java.util.List 传递。请参阅文档 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-in-clause

由于您正在使用 Spring,我建议使用 NamedParameterJdbcTemplate,因为它会自动将您的列表参数格式化为数据库可读的格式。

            String sql ="select * from table1 where ids in (:commaseperatedUUIDs)"

            List<Long> commaseparateduuids = new ArrayList<Long>();

            NamedParameterJdbcTemplate namedTemplate = new NamedParameterJdbcTemplate(myJdbcTemplate);

            MapSqlParameterSource parameters = new MapSqlParameterSource();

            parameters.addValue("commaseparateduuids",commaseparateduuids);

            namedTemplate.query(sql, parameters);

此外,请注意某些数据库管理系统(如 Oracle)对 IN 子句参数施加了限制。 postgres 就不是这样了,但是万一你以后要面临一些数据库迁移,考虑一下。