gpt4 book ai didi

java - Like 子句中的 MySQLSyntaxErrorException 错误

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:47 27 4
gpt4 key购买 nike

我有这个函数,它使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com