我有这个函数,它使用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)
答案 0 :(得分:3)
错误在这一行:
ResultSet rs = stmt.executeQuery(sql);
将其替换为
ResultSet rs = stmt.executeQuery();
要使用JDBC执行SQL字符串,您只需要将SQL字符串传递给JDBC一次,并且当您使用PreparedStatement时,一次是在准备语句时。设置完所有参数后,不带参数调用executeQuery()
将运行带有您设置的参数值的预准备语句。
调用带有单个字符串参数的executeQuery
版本将在该字符串中运行SQL,而不允许您使用任何参数值。这是因为PreparedStatement接口从Statement接口继承了此方法。
MySQL JDBC驱动程序的这种行为特别令人困惑。你不是第一个犯这个错误并想知道发生了什么的人,我不相信你会成为最后一个。正如评论中所指出的,当您在PreparedStatement上使用字符串调用executeQuery
时,JDBC驱动程序应该抛出异常。如果它这样做了,你很可能会更快地找到解决问题的方法。
我不知道您的变量sql
是什么。也许它只包含一个字母a
- 我能够通过运行stmt.executeQuery("a")
来重现您的错误消息。