我有一个Vert.x Web应用程序,需要查询运行Postgres 10.7的AWS RDS实例。 Vert.x JDBC客户端为io.vertx:vertx-jdbc-client:3.8.4
。我想查询一个表,约束是某个值包含在一组值中:
select from table where column in/any (?)
我遵循了Vertx文档,该文档说创建JsonArray
并用要插入查询中的值填充它。该列的类型为text
,我要匹配的列表是Java ArrayList<String>
。我的查询代码如下:
String sql = "SELECT a FROM table WHERE col IN (?)";
List<String> values = someObject.someField();
sqlClient.getConnection(connectionResult -> {
if (connectionResult.failed()) {
// handle
} else {
SQLConnection connection = connectionResult.result();
JsonArray params = new JsonArray()
.add(values);
connection.queryWithParams(sql, params, queryResult -> {
if (queryResult.failed()) {
// handle
} else {
// parse
}
});
}
});
查询失败,并显示错误:org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of io.vertx.core.json.JsonArray. Use setObject() with an explicit Types value to specify the type to use.
[我知道在最坏的情况下,我可以创建一个文字SQL字符串where col in (?, ?, ?, ..., ?)
并将列表中的每个String添加到JsonArray
,但必须有一种方法可以将ArrayList<String>
作为参数添加,使查询保持简单。如何在查询中指定要匹配的值列表?
Vert.x JDBC客户端不支持查询中的数组参数。
但是Vert.x Pg Client可以实现,它不依赖JDBC。您需要先修改您的查询:
SELECT a FROM table WHERE col = ANY(?)
然后:
pgClient.preparedQuery(query, Tuple.of(possibleValues), collector, handler);