有没有办法执行以下查询:
select * from table where field in (?)
并将列表/集合/数组作为?
占位符的值传递。
我正在使用 Apache db-commons 库中的 QueryRunner。
当然有,使用createArrayOf:
final List<Integer> id = new ArrayList<>();
id.add(12);
id.add(15);
final Array toDelete = connection.createArrayOf("int", id.toArray());
queryRunner.query(
connection,
"SELECT * FROM table WHERE id = ANY(?)",
resultSetHandler,
toDelete
);
(示例是使用 PostgreSQL,但也应该适用于其他人)
有许多本机支持的 Array 类型。例如String[]
. QueryRunner 接受可变参数,这会与数组类型混淆,因此您需要将其强制转换为 Object。
final int[] ids = new int[] {1, 2, 3};
queryRunner.query(
connection,
"SELECT * FROM table WHERE id = ANY(?)",
resultSetHandler,
(Object) ids
);
PostgreSQL 中支持的原始数组:
static {
ARRAY_CLASS_TO_SUPPORT.put(long[].class, LONG_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(int[].class, INT_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(short[].class, SHORT_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(double[].class, DOUBLE_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(float[].class, FLOAT_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(boolean[].class, BOOLEAN_ARRAY);
ARRAY_CLASS_TO_SUPPORT.put(String[].class, STRING_ARRAY);
}