java - Like 子句中的 MySQLSyntaxErrorException 错误

标签 java mysql jdbc

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

相关文章:

java - 在 Android Studio 中单击按钮时渲染新 View

java - 如何在 Java 中记录对存储对象/记录的更改

php - 优化 mysql 日期生成器?

php - 如何通过添加从 HTML 表单收到的数字来更新 SQL 中的表字段?

java - jdbc 开始失败

java - Spring Boot - 没有这样的列异常

java - 如何修复最常见的 LazyInitializationException - Hibernate JPA

java - grakn.ai安装报错: Could not find or load main class ai. grakn.client.Client

mysql - Rails - 按条件和限制排序?

java SQL异常分析