MySQLSyntaxErrorException при извлечении метаданных для «select ... limit?,?»подготовленный запрос - PullRequest
2 голосов
/ 26 мая 2011

Я пытаюсь получить метаданные из подготовленного оператора после выполнения запроса с параметрами в предложении «limit»:

PreparedStatement ps = conn.prepareStatement("select * from tbl limit ?, ?");
ps.setLong(1, 0);
ps.setLong(2, 10);
ps.execute();
ResultSetMetaData rsmd = ps.getMetaData();

Код вызывает исключение в последней строке:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''', ''' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
at com.mysql.jdbc.PreparedStatement.getMetaData(PreparedStatement.java:2882)
at ...... <my classes>

КогдаЯ пропускаю получение ResultSetMetaData, код работает просто отлично.Я не могу найти в Интернете и базе данных ошибок упоминания об ошибке.

Я пробовал следующие версии соединителя / J: 5.1.14, 5.1.12, 5.1.9 (зависимость Maven).

Версия сервера 5.0.77

Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 26 мая 2011

Это связано с тем, что подготовленный оператор назначает параметры при выполнении setLong ().

Когда вы используете сеттеры в подготовленном операторе, он заключает параметры в одинарные кавычки.

Я не уверен, почему «executeQuery» работает.Подобное исключение вы увидите, если непосредственно выполните следующий запрос.

"select * from tbl limit '0', '10'"

Вместо этого используйте следующее.

int startLimit = 0;
int endLimit = 10;
PreparedStatement ps = conn.prepareStatement("select * from tbl limit " + startLimit + " , " + endLimit);
ps.execute();
// you can use "Statement" if you dont have any more parameters
...