Я обновляю Hibernate в приложении с версии 3.x до последней версии (5.4.14 на данный момент) и прорабатываю все изменения. Похоже, было изменение в том, как TemporalType.DATE используется по отношению к собственным запросам. Для меня изменение похоже на ошибку, но, вероятно, есть разумное объяснение. В качестве очень простого варианта использования рассмотрим следующий запрос:
final Query query1 = entityManager.createNativeQuery("select :date");
query1.setParameter("date", new Date(), TemporalType.DATE);
query1.getSingleResult();
Это обычная настройка в этом приложении, и ожидаемое поведение состоит в том, что данная Дата будет рассматриваться как дата в базе данных. Обычно используется в запросах диапазона к столбцам даты. Тем не менее, это больше не работает в ребрах из-за части временной отметки Date , используемой в запросе. Когда я включаю трассировку Hibernate, я вижу следующее:
[BasicBinder # bind (64)] параметр привязки [1] как [TIMESTAMP] - [Пн 27 апреля 11:15:30 CEST 2020]
Для сравнения я выполнил следующий запрос:
final Query query2 = entityManager.createNativeQuery("select :date");
query2.setParameter("date", LocalDate.now());
query2.getSingleResult();
со следующей трассировкой:
[BasicBinder # bind (64)] параметр привязки [1] как [ДАТА] - [2020-04-27]
Очевидно, что два подхода рассматриваются по-разному. Для меня они должны быть эквивалентны. Когда я вхожу в код Hibernate для вызова setParameter , принимающего TemporalType.DATE , я вижу, что Hibernate просто игнорирует мой TemporalType.DATE .
Это для собственных запросов, действительно работает, как я ожидаю, для не собственных запросов при использовании setParameter и TemporalType.DATE .
Это ожидаемое поведение?