我有一个以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));
}
}
任何线索?
答案 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