Statement.executeQuery () генерирует исключение java.sql.SQLSyntaxErrorException при выполнении команды SELECT в MySQL - PullRequest
0 голосов
/ 18 января 2019

У меня есть метод, который выбирает записи из таблицы базы данных MySQL, используя JDBC API. Я использовал команду:

"SELECT column_1, column_2, ... FROM table;"

Имена столбцов предоставляются методу в виде ArrayList, запрос строится на основе имен столбцов и таблиц с использованием StringBuilder.

При выполнении построенного запроса с использованием createStatement () он выдает: "java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near from $tableName' at line 1"

Это полный код метода:

public ObservableList<ObservableList<String>> getTableData(String tableName, List<String> selectedParams, int rowCount) {
        try {
            StringBuilder query = new StringBuilder("select ");
            for (int i = 0; i < selectedParams.size(); i++) {
                query.append(selectedParams.get(i)).append(", ");
            }
            query.append("\b\b from ").append(tableName).append(" limit ").append(rowCount);
            System.out.println("query:" + query);
            ObservableList<ObservableList<String>> rows;
            try (ResultSet rset = st.executeQuery(query.toString())) {
                ResultSetMetaData rsmd = rset.getMetaData();
                rows = FXCollections.observableArrayList();
                while (rset.next()) {
                    ObservableList<String> row = FXCollections.observableArrayList();
                    int count = 1;
                    while (count <= rsmd.getColumnCount()) {
                        row.add(rset.getString(count));
                        count++;
                    }
                    rows.add(row);
                }
            }
            rows.forEach((row) -> {
                System.out.println(row);
            });
            return rows;
        } catch (SQLException ex) {
            Logger.getLogger(DBHelper.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

При запуске кода сгенерированный оператор вывода формы запроса выглядит примерно так:

"query:select territory from offices"

Я проверил этот запрос непосредственно к db и другой простой программе JDBC, и они оба работают нормально. За исключением этого метода. Пожалуйста, помогите.

--------------- Редактировать: забыл вставить сообщение об исключении: ---------------

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near from offices limit 10' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1218)

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Проблема в том, что

query.append("\b\b from ")

делает не удаление запятой и пробела из StringBuilder. Он может выглядеть так же, как при печати на консоль, но строка на самом деле содержит

select territory, ␈␈ from offices

и MySQL, видимо, это не нравится.

Вместо этого вы хотите удалить запятую из StringBuilder (и оставить пробел):

query.deleteCharAt(query.length() - 2).append("from ")
0 голосов
/ 18 января 2019

идентификатор проблемы в

 for (int i = 0; i < selectedParams.size(); i++) {
                query.append(selectedParams.get(i)).append(", ");
            }

приведенный выше код добавит дополнительный ',' после имен параметров вместо этого вы можете использовать

query.append(String.join(", ", selectedParams))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...