HQL Date бросает неожиданный токен

Привет у меня проблемы с выполнением следующего запроса в HQL:

1 ответ

Решение

Это очень опасный подход к выполнению запросов. Это та вещь, которая создает риски внедрения SQL. Никогда не объединяйте значения в строки SQL или HQL. Всегда используйте подход PreparedStatement, используя заполнители в строке SQL/HQL и устанавливая значения программно. Таким образом, драйвер (и Hibernate в случае HQL) может делать правильно с генерируемым SQL. Конечно, здесь значение является датой, а не строкой, переданной пользователем, но принцип все еще действует.

Что вам нужно сделать, это выполнить запрос, как

'select stuff from bar b where b.dateCreated = ?'

В HQL вы также можете использовать именованные параметры, которые обычно намного проще для чтения и самодокументирования, например

'select stuff from bar b where b.dateCreated = :date'

Затем установите значение как часть вызова, а не с конкатенацией строк.

Проблема здесь в том, что Java/Groovy toString значение даты совсем не похоже на то, каким должен быть формат даты в SQL (или HQL). К счастью, вам не нужно знать, каким должен быть этот формат, потому что драйвер JDBC делает.

Так что ваш запрос должен быть

def co = Bid.executeQuery(
   'select b.job from Bid b left join b.job j where j.dateCreated = :date',
   [date: fromDates[i])

Здесь я использую имя date но это произвольно, просто нужно сопоставить имя ключа на карте со значениями. Вы также можете использовать SQL-стиль? символы и список значений:

def co = Bid.executeQuery(
   'select b.job from Bid b left join b.job j where j.dateCreated = ?',
   [fromDates[i])

Как только вы это заработаете, вы обнаружите, что сравнение таких дат редко работает, потому что даты должны совпадать с точностью до миллисекунды, но это проблема для другого вопроса:)

Другие вопросы по тегам