Я провел пару дней, копаясь в этом.Кажется, корень проблемы в том, что сгенерированная грамматика Hibernate не включает поддержку временных литералов.
Спецификация JPA включает поддержку временных литералов, но не требует, чтобы поставщики персистентности переводили из синтаксиса JPA вродной синтаксис драйвера JDBC.Из JPA2 Spec 4.6.1:
"Синтаксис перехода JDBC может использоваться для спецификации литералов даты, времени и метки времени. Например:
SELECT o
FROM Customer c JOIN c.orders o
WHERE c.name = 'Smith'
AND o.submissionDate < {d '2008-12-31'}
Переносимость этогосинтаксис литералов даты, времени и метки времени зависит от используемого драйвера JDBC. Поставщикам постоянства не требуется переводить этот синтаксис в собственный синтаксис базы данных или драйвера. "
Было бы неплохо, если быHibernate предоставил поддержку литералов даты, но кажется, что реализация этого немного сложнее, чем я подозревал.
Функциональность, которой здесь не хватает, насколько мне нужно, заключается в том, что вы не можете сделать select coalesce(somePath, someDateLiteral)
запрос.Вы все еще можете сделать where somePath=someDate
.Пока они сопоставлены, вы можете бросить все, что хотите, в предложении where.