【问题标题】:how to pass comma seperated UUID in parameterized select query where IN clause如何在参数化选择查询 where IN 子句中传递逗号分隔的 UUID
【发布时间】:2015-10-21 09:46:05
【问题描述】:

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

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

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

operator does not exist: uuid = character varying

有什么线索吗?

【问题讨论】:

    标签: java sql spring postgresql spring-jdbc


    【解决方案1】:

    我也不了解 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]);
    

    【讨论】:

      【解决方案2】:

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

                  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 的情况,但如果您将来面临一些数据库迁移,请考虑到它。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 文档指出 Pass in the values as a java.util.List of primitive objects 但我有 uuid 字符串列表。并且需要在设置参数类型时指定类型。
        • 你的表定义是什么样的,或者uuid列的数据库类型是什么?
        猜你喜欢
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2020-01-10
        相关资源
        最近更新 更多