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

dauxcl2d  于 2023-04-04  发布在  Java
关注(0)|答案(3)|浏览(157)

我有一个以UUID为键的表,想用select query获取多行,所以查询如下:

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

我在Java代码中尝试它,我有List<UUID>,其中包含所有UUID,但如果我使用String操作将其逗号分隔,并将查询中的String作为参数传递,则会抛出SQL异常,声明

operator does not exist: uuid = character varying

有线索吗?

wkyowqbh

wkyowqbh1#

由于您使用的是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);

另外,请注意,一些dbms(如Oracle)对IN子句参数施加了限制。postgres不是这种情况,但如果您将来面临一些数据库迁移,请考虑到这一点。

1sbrub3j

1sbrub3j2#

问题是您的查询计算结果为:

select * from table1 where ids in ('abc,bcd,dbc')

而不是所需的形式:

select * from table1 where ids in ('abc','bcd','dbc')

您可以手动生成查询,添加多个参数并分别设置每个参数:

String 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++)
    ps.setString(i+1, ids[i]);

或者使用PreparedStatement::setArray方法:

String sql = "select * from table1 where ids in (?);";
PreparedStatement ps = connection.prepareStatement(sql);

ps.setArray(1, connection.createArrayOf("VARCHAR", ids.toArray()));
92vpleto

92vpleto3#

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

相关问题