Statement.executeQuery() 在 MySQL 中执行 SELECT 命令时抛出 java.sql.SQLSyntaxErrorException
Statement.executeQuery() throws java.sql.SQLSyntaxErrorException when executing SELECT command in MySQL
我有一个方法可以使用 JDBC API 从 MySQL db table 中获取记录。
我一直在使用的命令是:
"SELECT column_1, column_2, ... FROM table;"
列名称以 ArrayList 的形式提供给方法,正在使用 StringBuilder 基于列和 table 名称构建查询。
使用 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;
}
当运行ning 代码时,生成的查询表单打印语句如下所示:
"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)
中的问题 ID
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 中删除尾随逗号和 space。它可能 看起来 就像您将它打印到控制台时一样,但该字符串实际上确实包含
select territory, ␈␈ from offices
和MySQL显然不喜欢那样。
相反,您实际上想要从 StringBuilder 中 删除 逗号(并保留 space):
query.deleteCharAt(query.length() - 2).append("from ")
我有一个方法可以使用 JDBC API 从 MySQL db table 中获取记录。 我一直在使用的命令是:
"SELECT column_1, column_2, ... FROM table;"
列名称以 ArrayList 的形式提供给方法,正在使用 StringBuilder 基于列和 table 名称构建查询。
使用 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;
}
当运行ning 代码时,生成的查询表单打印语句如下所示:
"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)
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 中删除尾随逗号和 space。它可能 看起来 就像您将它打印到控制台时一样,但该字符串实际上确实包含
select territory, ␈␈ from offices
和MySQL显然不喜欢那样。
相反,您实际上想要从 StringBuilder 中 删除 逗号(并保留 space):
query.deleteCharAt(query.length() - 2).append("from ")