我有这个函数,它使用 like 子句从 MySQL 获取对象列表,但是在测试时,返回 MySQLSyntaxErrorException 错误,我应该怎么做?
代码
@Override
public List<Livro> getLista(String nm) {
// TODO Auto-generated method stub
List<Livro> lista = new ArrayList<Livro>();
try {
String query= "SELECT L.*, nmautor, nmeditora FROM tblivro L, tbeditora E,tbautor A "
+ "WHERE nmlivro LIKE ? and L.cdautor = A.cdautor and L.cdeditora = E.cdeditora ";
PreparedStatement stmt = conn.prepareStatement(query);
String like = "%"+nm+"%";
stmt.setString(1, like);
ResultSet rs = stmt.executeQuery(sql);
...
}}
完全错误
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'a' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2470)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2617)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2546)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2504)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1370)
at biblioc.dados.LivroDAO.getLista(LivroDAO.java:387)
最佳答案
错误在这一行:
ResultSet rs = stmt.executeQuery(sql);
替换为
ResultSet rs = stmt.executeQuery();
要使用 JDBC 执行 SQL 字符串,您只需将 SQL 字符串传递给 JDBC 一次,并且当您使用 PreparedStatement 时,一次就是准备语句。设置完所有参数后,调用不带参数的 executeQuery()
将使用您设置的参数值运行准备好的语句。
调用采用单个字符串参数的 executeQuery
版本将运行该字符串中的 SQL,不允许您使用任何参数值。这是因为PreparedStatement接口(interface)继承了Statement接口(interface)的这个方法。
MySQL JDBC 驱动程序的这种行为特别令人困惑。您绝非第一个犯此错误并想知道发生了什么的人,而且我不相信您会是最后一个。正如评论中所指出的,当您使用 PreparedStatement 上的字符串调用 executeQuery
时,JDBC 驱动程序应该会抛出异常。如果这样做,您可能会更快地找到解决问题的方法。
我不知道你的变量 sql
是什么。也许它只包含一个字母 a
- 我能够通过运行 stmt.executeQuery("a")
重现您的错误消息。
关于java - Like 子句中的 MySQLSyntaxErrorException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252090/