【问题标题】:Vertx JDBC client queryWithParams - how to add a list?Vertx JDBC 客户端 queryWithParams - 如何添加列表?
【发布时间】:2019-07-10 08:38:34
【问题描述】:

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

如何将可能的currency 值列表传递给查询? 我试过new JsonArray().add(new JsonArray(currencies),但出现异常

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

【问题讨论】:

    标签: postgresql jdbc vert.x


    【解决方案1】:

    简短的回答是,您不能使用通用 Vertx JDBC 客户端将 List 作为查询参数添加,但由于您使用的是 Postgres,因此您可以使用一个名为 vertx-pg-client 的 Postgres 特定库.我用这段代码实现了大致相同的查询:

    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

    【讨论】:

    • 我通过应用上述方法得到以下异常:java.lang.IllegalArgumentException: Values [[]] cannot be coerced to [String[]] 任何想法?
    • 您在 Tuple 中包装的对象类型是什么?是 List 吗?
    【解决方案2】:

    有两种选择。

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

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

    如果你只支持 PostreSQL,你可以使用 ANY 操作符来代替:

    WHERE currency = ANY(?)
    

    【讨论】:

    • 第一个选项不允许我提前创建查询第二个(仅 PSQL 对我有好处) - 我仍然不明白如何将列表放入 JsonArray
    • 绑定参数时,不要使用 JsonArray,而是使用普通的 Java 数组。
    • Vertx API 只允许使用 JsonArray
    • 您确实需要通过一些代码示例来扩展您的问题。特别是您用于 DB 的 lib 以及什么版本。谢谢。
    • 正如我在问题中所说,我使用的是 Vertx JDBC 客户端。我的问题是关于vertx.io/docs/apidocs/io/vertx/ext/sql/… 方法
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2020-02-15
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多