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

时间:2015-10-21 09:46:05

标签: java sql spring postgresql spring-jdbc

我有一个以select * from table1 where ids in (:commaseperatedUUIDs); //DB is postgreSql 作为键的表,并希望使用select查询获取多行,因此查询如下:

List<UUID>

我在Java代码中尝试它,我有operator does not exist: uuid = character varying ,其中包含所有UUID,但如果我使用逗号分隔,当然通过使用String操作并将查询中的String作为参数传递,那么它会抛出SQL Exception说明

private void ScheduleGrid_OnLoadingRow(object sender, DataGridRowEventArgs e)
{
    var schedule = e.Row.DataContext as OrderScheduleModel;
    if(schedule==null)
        return;
    if (schedule.Date.DayOfWeek == DayOfWeek.Saturday || schedule.Date.DayOfWeek == DayOfWeek.Sunday)
    {
        e.Row.Background = new SolidColorBrush(Color.FromArgb(0xff, 0x90, 0xee, 0x90));
    }
}

任何线索?

3 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:1)

由于您使用的是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来说情况并非如此,但如果您将来面临一些数据库迁移,请将其考虑在内。

答案 2 :(得分:0)

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