#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 в качестве обходного пути.