Как использовать список в качестве источника параметров для SQL запросов с Vertx JDB C Client? - PullRequest
1 голос
/ 15 января 2020

У меня есть веб-приложение Vert.x, которому нужно запросить экземпляр AWS RDS, работающий Postgres 10.7. Клиент Vert.x JDB C имеет значение 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 (?, ?, ?, ..., ?) и добавьте каждую строку из списка в JsonArray, но должен быть способ просто добавить ArrayList<String> в качестве параметра и сделать запрос простым. Как я могу указать список значений для сравнения в моем запросе?

1 Ответ

3 голосов
/ 16 января 2020

Клиент Vert.x JDB C не поддерживает параметры массива в запросах.

Однако это возможно с клиентом Vert.x Pg , который не зависит от JDB C. Сначала необходимо изменить запрос:

SELECT a FROM table WHERE col = ANY(?)

Затем:

pgClient.preparedQuery(query, Tuple.of(possibleValues), collector, handler);
...