Akash Rajbanshi 的答案是错误的,因为它会创建类似的查询
select * from TABLE_1 where (COLUMN_1, COLUMN2) in ("Val1","val2"), ("Val3", "Val4")
but we need
select * from TABLE_1 where (COLUMN_1, COLUMN2) in ("Val1","Val3"), ("val2", "Val4")
另外,如果我们想要超过 2 个参数,它会失败并抛出异常
错误:行表达式中的条目数不相等。它试图使 ((?, ?, ?), (?, ?, ?))
所以我用我自己的实现来解决声明中的 2 列。它生成一对参数并附加到StringBuilder 构造,如((?,?),(?,?),...,(?,?))
public static <K, V> Pair<StringBuilder, Object[]> makeInQuery(StringBuilder sqlBuilder , Collection<Pair<K, V>> pairs) {
sqlBuilder.append("(");
Object[] params = new Object[pairs.size() * 2];
int i = 0;
for (Pair<K, V> pair : pairs) {
if (i > 0) {
sqlBuilder.append(",");
}
sqlBuilder.append("(?,?)");
params[i] = pair.getFirst();
params[i + 1] = pair.getSecond();
i = i + 2;
}
sqlBuilder.append(")");
return new Pair<>(sqlBuilder, params);
}
比我们使用jdbcTemplate
public ReturnSomething findByNodes(Collection<Pair<UUID,UUID>> fromToPairs) {
StringBuilder sqlBuilder = new StringBuilder(BEFORE_IN_STATEMENT);
Pair<StringBuilder, Object[]> sqlParamsPair = makeInQuery(sqlBuilder, fromToPairs);
return jdbcTemplate.query(sqlParamsPair.getFirst().toString(), sqlParamsPair.getSecond(), entityMapper);
}