У меня есть метод, который извлекает записи из таблицы базы данных 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)
Извините, я забыл вставить сообщение об исключении. Я отредактировал вопрос. Запрос, кажется, не заканчивается на ",". Я использовал "\b\b" для удаления лишней запятой и лишнего пробела после того, как имя последнего столбца было добавлено к строке.
@MarkRotteveel, ты был прав. Именно "\b\b" создавало проблему. Спасибо, что указали на это.




идентификатор выпуска в
for (int i = 0; i < selectedParams.size(); i++) {
query.append(selectedParams.get(i)).append(", ");
}
приведенный выше код добавит дополнительный ',' после имен параметров вместо этого вы можете использовать
query.append(String.join(", ", selectedParams))
Это сделало мой спагетти-код намного чище. Спасибо! :)
Проблема в том, что
query.append("\b\b from ")
удаляет ли нет завершающую запятую и пробел из StringBuilder. Это может быть Посмотрите, как если бы вы выводили его на консоль, но на самом деле строка содержит
select territory, ␈␈ from offices
и MySQL это явно не нравится.
Вместо этого вы хотите на самом деле Удалить запятую из StringBuilder (и оставить пробел):
query.deleteCharAt(query.length() - 2).append("from ")
Обратите внимание, что ваш список выбора заканчивается
,в коде, как показано. Скорее всего это причина проблемы. Кроме того, почему у вас в строке\b? Скорее всего, это работает не так, как вы думаете. Вместо этого попробуйте удалить завершающий,из StringBuilder.