6

有没有办法执行以下查询:

select * from table where field in (?)

并将列表/集合/数组作为?占位符的值传递。

我正在使用 Apache db-commons 库中的 QueryRunner。

4

2 回答 2

3

当然有,使用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,但也应该适用于其他人)

于 2014-03-14T10:30:43.387 回答
0

有许多本机支持的 ​​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);
}

PrimitiveArraySupport.java

于 2021-09-16T10:35:07.170 回答