Запрос GORM вызывает ошибку базы данных (grails 1.1.1) - PullRequest
1 голос
/ 26 марта 2012

(это кросс-пост от grailsforum.co.uk)

Привет всем, я относительно новичок в Grails (и в Spring, Hibernate и т. Д.), Поэтому, пожалуйста, прости меня, если это вопрос нуба. Поиск в Google ни к чему не привел, но это довольно сложная проблема для поиска.

Когда я запускаю конкретный запрос GORM (в grails 1.1.1), он обычно работает нормально, но в случае, когда в базе данных нет соответствующих записей, вместо того, чтобы ничего не возвращать, я получаю исключение, всплывающее прямо из уровень драйвера базы данных. Я задавался вопросом, была ли это проблема с конкретной разновидностью Oracle, в которой работает моя локальная база данных dev, но это также происходит при работе в базе данных JDBC в памяти и на удаленном сервере dev, который имеет базу данных, эквивалентную тем, которые мы использование производственных серверов. Насколько я могу судить, кажется, что где-то внизу запрос фактически переходит в недопустимый SQL.

Запрос находится в доменном классе CourseTerm, который представляет семестр в университете. Этот класс определяет начальную и конечную даты как свойства. Мой запрос направлен на выбор набора всех терминов курса, активных на определенную дату (их может быть несколько, поскольку они могут перекрываться), как показано ниже:

def currentCourseTerms(date = new Date()) {
     return CourseTerm.findAllByCourseStartDateLessThanAndCourseFinishDateGreaterThan(date, date)
}

Как я уже сказал, это прекрасно работает, если есть какие-либо условия курса, которые соответствуют запросу. Но в случае, если термины не являются текущими, запрос не выполняется, и я получаю следующий вывод:

Error 500: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
Servlet: grails
URI: /ltrp/grails/scheduleableCourse/list.dispatch
Exception Message: ORA-00936: missing expression 
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query 
Class: ScheduleableCourseController

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

2012-03-23 15:04:18,664 [13262636@qtp-21448718-2] ERROR util.JDBCExceptionReporter  - ORA-00936: missing expression

Мои исследования и общая интуиция говорят мне, что это, вероятно, ошибка в Grails или Spring, и что решение будет заключаться в обновлении до более новой версии Grails. Это определенно входит в план, так как я не являюсь поклонником запуска устаревших веб-приложений в лучшие времена, но моя недавняя попытка перейти на последнюю версию 1.x не увенчалась успехом, и я не есть время, чтобы бороться с этим прямо сейчас.

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

1 Ответ

1 голос
/ 02 апреля 2012

Вы можете проверить генерируемый SQL, включив ведение журнала SQL, как описано здесь .Возьмите этот запрос и выполните на БД и посмотрите, работает ли он.Это должно сказать вам, если sql, сгенерированный hibernate, ошибочен или вы что-то упустили.Кроме того, вы можете написать свой собственный именованный запрос и использовать предложение BETWEEN и посмотреть, работает ли он во всех случаях.

...