Почему я не могу сравнить java.util.Дата с датами mysql?

#java #mysql #hibernate #date #jpa

#java #mysql #спящий режим #Дата #jpa

Вопрос:

у меня странная ситуация:

Я использую jpa / hibernate для получения строк из таблицы базы данных MySQL, где столбец даты больше или равен дате, которую я отправляю (удален ненужный код):

 SELECT sp.* FROM spaceproduct sp where sp.enddate is null or sp.enddate >= :endDate)
  

в моем коде я в основном делаю:

 q.setParameter("endDate", new java.util.Date());
  

Теперь моя проблема в том, что дата в БД совпадает с датой. т. Е. «сегодня», она не отображается. Я предполагаю, что это потому, что он каким-то образом также сравнивает временную часть java.util.date с тем, что находится в базе данных (значение db равно только «2011-10-28», но дата java.util — 2011-10-28T13:36:43.130 0200)

Однако, если я изменю параметр date, который я установил, на java.sql.Date() , это сработает!

Теперь, учитывая, что мой столбец базы данных MySQL — это дата, а не DateTime, разве это не ошибка? Даже если я отправлю java.util.date, разве он не должен сравнивать только часть даты, поскольку мой столбец DB — это дата?

РЕДАКТИРОВАТЬ: я попытался использовать util-date и преобразовать его в sql-date. Это на самом деле тоже не работает:

 java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
q.setParameter("endDate", sqlDate);
  

Итак, из того, что я вижу, я должен установить временную часть равной 0 также для sql-dates, если я не использую устаревший конструктор «год-месяц-дата»…

Комментарии:

1. Нет, это не ошибка. 2011-10-28 не >= 2011-10-28T13:36:43.130 0200. Ваш объект date имеет 2011-10-28T13:36:43.130 0200, поэтому он терпит неудачу. однако java.sql.Date хранит только день / месяц / год, или, скорее, возвращает его только при вызове toString(), поэтому он равен 2011-10-28.

2. Привет, спасибо за информацию. Посмотрите Мой комментарий к редактированию выше и скажите, что вы думаете, приятель

Ответ №1:

Вы можете использовать System.currentTimeMillis() вместо создания утилиты Date , чтобы получить такую длину. Я бы ожидал, что ваш отредактированный код будет работать, но если это не так, у вас нет другого выбора, кроме как каким-то образом отбросить часы / минуты / секунды / миллисекунды, например, делать System.currentTimeMillis() % 24 * 60 * 60 * 1000 (конечно, лучше хранить это в константе, но это передает суть). Или вы могли бы просто использовать Joda.

Ответ №2:

Вы должны использовать java.sql.Date, поскольку это просто дата и не содержит информации о времени. Причина, по которой он работает с java.util.Дата — это то, что либо база данных, либо драйвер JDBC выполняет расширяющее преобразование столбца из ДАТЫ во ВРЕМЕННУЮ МЕТКУ (с временной частью 00:00:00), чтобы сравнение работало с параметром.

Комментарии:

1. btw. java.sql.Date расширяет java.util.Date

2. Марк, спасибо за ваши мысли. Однако моя основная проблема с sql-dates заключается в том, что любой конструктор «по дате», то есть year-month-date, устарел. Вы должны в основном использовать long-constructor, и тогда я мог бы также использовать JodaTime «datemidnight» вместо этого… У вас есть идея получше?

3. Хорошо, тогда я предполагаю, что это ошибка в драйвере Connector / J, поскольку я только что заметил, что на самом деле драйвер JDBC отвечает за преобразование java.sql.Date в эквивалент ДАТЫ (поэтому без временной части). Вы могли бы попробовать использовать java.sql.Date.toString() и setString в качестве обходного пути.