AWS Athena JDBC PreparedStatement - PullRequest
       14

AWS Athena JDBC PreparedStatement

0 голосов
/ 28 мая 2018

Мне не удается заставить драйвер AWS Athena JDBC работать с PreparedStatement и связанными переменными.Если я поместил желаемое значение столбца непосредственно в строку SQL, это работает.Но если я использую заполнители '?'и я связываю переменные с сеттерами PreparedStatement, это не работает.Конечно, мы знаем, что мы должны использовать второй способ (для кэширования, избегать SQL-инъекций и т. Д.).

Я использую драйвер JDBC AthenaJDBC42_2.0.2.jar.Я получаю следующую ошибку при попытке использовать заполнители '?в строке SQL.Ошибка выдается, когда я получаю PreparedStatement из соединения JDBC.Он жалуется на параметры не найдены.Но я установил их после в коде.Как я могу установить параметры перед получением PreparedStatement :-)?

java.sql.SQLException: [Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. SYNTAX_ERROR: line 1:1: Incorrect number of parameters: expected 1 but found 0

at com.simba.athena.athena.api.AJClient.executeQuery(Unknown Source)
at com.simba.athena.athena.dataengine.AJQueryExecutor.<init>(Unknown Source)
at com.simba.athena.athena.dataengine.AJDataEngine.prepare(Unknown Source)
at com.simba.athena.jdbc.common.SPreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc41.S41PreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc42.S42PreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc42.JDBC42ObjectFactory.createPreparedStatement(Unknown Source)
at com.simba.athena.athena.jdbc42.AJJDBC42ObjectFactory.createPreparedStatement(Unknown Source)
at com.simba.athena.jdbc.common.SConnection.prepareStatement(Unknown Source)
at com.simba.athena.jdbc.common.SConnection.prepareStatement(Unknown Source)
at ****************************************************
Caused by: com.simba.athena.support.exceptions.GeneralException: [Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. SYNTAX_ERROR: line 1:1: Incorrect number of parameters: expected 1 but found 0
... 37 more

Я что-то не так делаю?Вот код

    @Test
public void testWhichFails() throws SQLException {
    try (Connection connection = athenaConnexion()) {
        String sql = "select * from my_table where col = ? limit 10";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setInt(1, 30);
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println("rs.getString(1) = " + rs.getString(1));
                }
            }
        }
    }
}

@Test
public void testWhichWorks() throws SQLException {
    try (Connection connection = athenaConnexion()) {
        String sql = "select * from my_table where col = 30 limit 10";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            //ps.setInt(1, 30);
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println("rs.getString(1) = " + rs.getString(1));
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 августа 2018

Athena поддерживает только перечисленные здесь функции SQL Функции SQL Athena , которые, в свою очередь, основаны на Функции и операторы Presto версия 0.172 со следующим списком Ограничения, связанные с SQL Athena .Подготовленные заявления можно использовать в новой версии Presto Документация Presto .Однако Athena пока не поддерживает эту новую версию.Вы всегда можете написать в службу поддержки Athena и попросить добавить функцию ПОДГОТОВИТЬ.

0 голосов
/ 07 июня 2018

В настоящее время я не думаю, что jar-файл Athena JDBC поддерживает подготовленные операторы с переменными позиции.При использовании myBatis подготовленная переменная оператора #{variable} не сработала, а замена строки ${variable} сработала.

  • select * from my_table where col = #{col} limit 10 не сработала
  • select * from my_table where col = ${col} limit 10действительно работал

Я думаю, что ошибка возникает из-за того, что объект Athena SConnection не поддерживает переменные позиции, но, поскольку у меня нет источника, я не могу проверить.

...