Есть ли способ использовать литералы меток времени в запросах JPQL с Hibernate?
Существует постоянная временная метка для сравнения, которая должна быть помещена в JPQL-запрос.
Теперь это работает так
TypedQuery<TestEntity> query = entityManager
.createQuery("select t from TestEntity t where greatest(nvl(t.f1, :nullDate), nvl(t.f2, :nullDate)) between :date1 and :date2")
.setParameter("date1", date1)
.setParameter("date2", date2)
.setParameter("nulllDate", LocalDateTime.of(1970, 1, 1, 0, 0, 0, 1))
Я пытался (решение найдено здесь и здесь ) изменить запрос на следующий
select t from TestEntity t where greatest(nvl(t.f1, {ts '1970-01-01 00:00:00:000000001'}), nvl(t.f2, {ts '1970-01-01 00:00:00:000000001'})) between :startChanges and :endChanges
но получил ошибку во время выполнения
org.hibernate.QueryException: unexpected char: '{' [select t from TestEntity t where greatest(nvl(t.f1, {ts '1970-01-01 00:00:00:000000001'}), nvl(t.f2, {ts '1970-01-01 00:00:00:000000001'})) between :startChanges and :endChanges]
Моя настройка
Java 8
JPA 2,1
Spring Boot 1.4.2.RELEASE
Hibernate 5.1.0.Final (воспроизводится также с 5.2.16.Final)
Oracle 11.2
UPD: возможно, это не соответствует спецификации, но самые большие функции / nvl правильно передаются из JPQL в SQL с помощью приведенного выше кода. Я пытался обернуть greatest
/ nvl
в function
, но литералы по-прежнему не принимаются.