Vertx JDBC客户端queryWithParams-如何添加列表?

时间:2019-07-10 08:38:34

标签: postgresql jdbc vert.x

我有条件为arg的SQL查询 我正在使用vertx JDBC客户端currency in ?方法,该方法在JsonArray中接收查询参数。

如何将可能的queryWithparams值列表传递给查询? 我尝试了currency,但遇到了异常情况

  

org.postgresql.util.PSQLException:无法推断用于io.vertx.core.json.JsonArray实例的SQL类型。将setObject()与显式的Types值一起使用以指定要使用的类型。

2 个答案:

答案 0 :(得分:1)

简短的答案是,您无法使用通用的Vertx JDBC客户端添加列表作为查询参数,但是由于您使用的是Postgres,因此有一个特定于Postgres的名为vertx-pg-client的库可以使用。我实现了与您使用此代码大致相同的查询:

List<String> currencies = whatever();
String uri = "your-uri";
String query = "select from table where currency = any($1)";
PgConnection.connect(vertx, uri, connectionResult -> {
    if (connectionResult.failed()) {
        // handle
    } else {
        PgConnection connection = connectionResult.result();
        Tuple params = Tuple.of(currencies);

        doQuery(query, connection, params).setHandler(queryResult -> {
            connection.close();
            msg.reply(queryResult.result());
        });
    }
});

    private Future<String> doQuery(String sql, PgConnection connection, Tuple params) {
        Promise<String> promise = Promise.promise();
        connection.preparedQuery(sql, params, res -> {
            if (res.failed()) {
                // log
                promise.fail(res.cause());
            } else {
                RowSet<Row> rowSet = res.result();
                // do something with the rows and construct a return object (here, a string)
                String result = something;
                promise.complete(result);
            }
        });
        return promise.future();
    }

所有荣誉归功于@tsegismont,他曾向我提出相同的问题here

答案 1 :(得分:0)

有两个选项。

如果要支持多个数据库,则必须自己扩展表达式:

"... currency IN (" + String.join(",", Collections.nCopies(currencies.size(), "?")) + ")"

如果仅支持PostreSQL,则可以改用ANY运算符:

WHERE currency = ANY(?)