2012-06-06 5 views
0

Я пытаюсь выполнить подготовленные Постулаты, используя следующий:prepareStatement(), как представляется, зачистки точки с запятой

dbaBean.setPrepStmt(dbaBean.getConn().prepareStatement(
    "SELECT id, author, title, url, article_text, date_created " + 
      "FROM articles WHERE " + 
      "(EXTRACT(YEAR FROM date_created) = ? OR ? is null) " + 
      "AND (EXTRACT(MONTH FROM date_created) = ? OR ? is null) " + 
      "AND (EXTRACT(DAY FROM date_created) = ? OR ? is null) AND " + 
      "(url = ? OR ? is null) " + 
      "ORDER BY date_created DESC;")); 

dbaBean.getPrepStmt().setString(1, year); 
dbaBean.getPrepStmt().setString(2, year); 
dbaBean.getPrepStmt().setString(3, month); 
dbaBean.getPrepStmt().setString(4, month); 
dbaBean.getPrepStmt().setString(5, day); 
dbaBean.getPrepStmt().setString(6, day); 
dbaBean.getPrepStmt().setString(7, URL); 
dbaBean.getPrepStmt().setString(8, URL); 

System.out.println(dbaBean.getPrepStmt().toString()); 

dbaBean является объектом, который обеспечивает связь и подготовленные Постулаты. Это не делает никаких манипуляций вообще.

Я успешно использовал вышеуказанный код для других методов и не имел никаких проблем с ним. Теперь эта функция, как представляется, зачищает точку с запятой в конце, например. это выводится с помощью строки System.out:

SELECT id, author, title, url, article_text, date_created FROM articles WHERE (EXTRACT(YEAR FROM date_created) = NULL OR NULL is null) AND (EXTRACT(MONTH FROM date_created) = NULL OR NULL is null) AND (EXTRACT(DAY FROM date_created) = NULL OR NULL is null) AND (url = 'someurl' OR 'someurl' is null) ORDER BY date_created desc 

Обратите внимание, что точка с запятой не указана.

Я попытался добавить вторую точку с запятой, и она тоже «съедена».

Другие изменения передаются штрафом (например, другим полем для выбора).

Это постгреск, если это имеет значение.

Редактировать: Мне очень жаль, потому что у меня ошибка при выполнении этого запроса, и я подумал, что падение точки с запятой является потенциальной ошибкой. Ниже приведенные ответы указывают на то, что это не так, и мне нужно искать в другом месте.

+4

Почему вас это волнует? Точка с запятой не является частью оператора SQL, она скорее является разделителем и не нужна, если вы выдаете только один оператор. –

+0

Он * не * имеет значение до тех пор, пока оператор выполняет штраф. – adarshr

+0

Я согласен с предыдущими комментариями. Точка с запятой не является частью инструкции SQL - она ​​используется интерфейсами СУБД, чтобы указать, что команда SQL закончена и готова к выполнению (если вы только нажмете ENTER, она поймет, что вы набираете многострочную команду). Ergo, подготовленное заявление, вероятно, ограничивает терминаторы, чтобы сохранить только то, что действительно является вашим заявлением. – rlinden

ответ

3

я провел несколько минут траления через исходный драйвер код Postgresql JDBC, и, кажется, что то, что происходит следующим образом:

  • Когда создаются подготовленный оператор, водитель делает частичный разбор на разбивать SQL на операторы, находить заполнители и (я думаю) удалять любые комментарии.

  • Результат разбора хранится в объекте PreparedStatement в виде последовательности фрагментов.

  • Если вы звоните toString() заявление, метод реконструирует SQL, вставив значения для заполнителей, и добавив точку с запятой между каждое заявление ... если есть несколько заявлений.

Таким образом, исчезающие точки с запятой не являются ошибкой, это особенность. Ничто в спецификациях JDBC не требует, чтобы метод toString() предоставил вам запрос в его исходной форме ... или в любой форме вообще. И, кроме того, обычная практика использования (по крайней мере для Postgresql) оставления конечной точки с запятой при написании SQL для JDBC.

1

preparedStatement(String sql) метод принимает входную строку и создает объект CallableStatement для вызова хранимых процедур базы данных.

Во время инициализации объекта CallableStatement строка sql преобразуется в исходную грамматику SQL системы драйвером jdbc.

Поскольку точка с запятой является разделителем для Postgresql, вы можете предположить, что она удалена драйвером jdbc и может отличаться при использовании других реализаций драйвера jdbc. Таким образом, лучшим вариантом будет удаление его из вашей строки SQL.

Смежные вопросы