Like子句中的MySQLSyntaxErrorException错误

时间:2015-12-13 14:20:46

标签: 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)

1 个答案:

答案 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")来重现您的错误消息。