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])
Как только вы это заработаете, вы обнаружите, что сравнение таких дат редко работает, потому что даты должны совпадать с точностью до миллисекунды, но это проблема для другого вопроса:)