SQL исключение при подготовке запроса с ORMLite - PullRequest
2 голосов
/ 12 марта 2011

Я использую ORM (ORMlite), и все мои звонки идут хорошо, пока я не получу следующую ошибку.

Исключение в потоке "main" org.h2.jdbc.JdbcSQLException: синтаксическая ошибка в операторе SQL "SELECT * FROM" "STORIES" "WHERE" "TITLE" "= 'Глубокий регистр ведет' НЕСЛЕДУЮЩАЯ [*] '' ";Оператор SQL: SELECT * FROM Stories WHERE title = 'Глубокие ведущие регистры' не соблюдаются '' [42000-152] в org.h2.message.DbException.getJdbcSQLException (DbException.java:327) в org.h2.message.DbException.get (DbException.java:167) в org.h2.message.DbException.get (DbException.java:144) в org.h2.message.DbException.getSyntaxError (DbException.java:179) в org.h2.command.Parser.getSyntaxError (Parser.java:480) в org.h2.command.Parser.prepareCommand (Parser.java:229) в org.h2.engine.Session.prepareLocal (Session.java:426) в орг.h2.engine.Session.prepareCommand (Session.java:374) в org.h2.jdbc.JdbcConnection.prepareCommand (JdbcConnection.java:1093) в org.h2.jdbc.JdbcPreparedStatement. (JdbcPreparedStatement. org. at. at71)h2.jdbc.JdbcConnection.prepareStatement (JdbcConnection.java:601) по адресу com.j256.ormlite.jdbc.JdbcDatabaseConnection.compileStatement (JdbcDatabaseConnection.java:83) по адресу com.j256.ormlite.stredtpJava: 44) на com.j256.ormlite.stmt.StatementExecutor.buildIterator (StatementExecutor.java:169) в com.j256.ormlite.stmt.StatementExecutor.query (StatementExecutor.java:119) в com.j256.ormlite.dao.BaseDaoImpl.query (BaseDaoImpl.java6: 189)*

Я не понимаю, что происходит не так.Я звоню на поиск из этих строк:

// get our query builder from the DAO
QueryBuilder<Story, Integer> queryBuilder = StoryDao.queryBuilder();
// the 'title' field must be equal to title (a variable)
queryBuilder.where().eq(Story.TITLE_FIELD_NAME, title);
// prepare our sql statement
PreparedQuery<Story> preparedQuery = queryBuilder.prepare();
// query for all stories that have that title
List<Story> accountList = StoryDao.query(preparedQuery);

Ответы [ 4 ]

10 голосов
/ 12 марта 2011

Синтаксическая ошибка в операторе SQL "SELECT * FROM", "STORIES", "WHERE", "TITLE" "...

@ bemace правильно, что в заголовке есть кавычки, которые испортили экранирование строк, сгенерированных запросом.

В ORMLite, вы должны использовать функцию SelectArg, которая будет генерировать запрос с SQL? аргументы, а затем передать строку непосредственно в подготовленный оператор.

Для документации по SelectArg см .:

http://ormlite.com/docs/select-arg

С SelectArg вы бы сделали что-то вроде:

QueryBuilder<Story, Integer> queryBuilder = StoryDao.queryBuilder();
SelectArg titleArg = new SelectArg();
queryBuilder.where().eq(Story.TITLE_FIELD_NAME, titleArg);
PreparedQuery<Story> preparedQuery = queryBuilder.prepare();
titleArg.setValue(title);
List<Story> accountList = StoryDao.query(preparedQuery);
1 голос
/ 12 марта 2011

Я отчасти догадываюсь, но похоже, что есть проблема со значением в поле title, возможно, неэкранированная кавычка?

Я не знаком с ORMLite, но title = 'Deepcut case leads 'not followed'' выглядит неправильно. Вероятно, должно быть "Deepcut case leads 'not followed'" или 'Deepcut case leads \'not followed\'' или что-то подобное.

1 голос
/ 12 марта 2011

Правильный синтаксис для оператора:

SELECT * FROM Stories WHERE title = 'Deepcut case leads ''not followed'' ';

Обратите внимание на дублированные одинарные кавычки внутри строкового литерала.

Вы должны указать своему уровню ORM следовать правилам ANSI SQL для литералов.

0 голосов
/ 12 марта 2011

Исключение говорит о наличии некоторой синтаксической проблемы с вашим сгенерированным оператором SELECT.Можете ли вы распечатать сгенерированный запрос?Это может помочь вам определить точную проблему здесь.

РЕДАКТИРОВАТЬ: При внимательном рассмотрении вашей трассировки видно, что экранирование строк здесь не обрабатывается должным образом.Это ваш собственный QueryBuilder?Кроме того, согласно этой ссылке , вы используете SelectArg или непосредственно устанавливаете заголовок?

...