JPA / Hibernate заказ по времени Joda не работает правильно в Гонконге - PullRequest
1 голос
/ 27 декабря 2011

моя проблема в том, что когда я делаю запрос к базе данных с заказом startTime, где startTime - это время Joda, он возвращает время, начинающееся в 16:00.

Теперь, 4 часа дня - ровно 8 часов от 12 часов ночи, и по совпадению я живу в Гонконге, и это мой часовой пояс, а часовой пояс Гонконга - 8 часов с полуночи.

Мое поле JPT startTime:

@Index(name = "bookingStartTimeIndex")
@Column(name = "start_time")
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime")
private LocalTime startTime;

Я использую JPA / Hibernate, и мой запрос в основном для выбора * где:

order by b.startTime asc

Теперь в этой таблице хранятся объекты со временем с 9:00 до 18:00. Из этого «порядка по» возвращаются сущности, начиная с 16:00 до 18:00, затем с 9:00 до 16:00. Похоже, он решил, что 4 часа ночи - это как-то полночь.

Это база данных postgresql, когда я смотрю, что мой столбец базы данных имеет тип данных time_without_time_zone.

Так, как я могу получить это, чтобы заказать организации обычно с 9:00 до 18:00? * 10101 *


Обходной путь, который я нашел, состоит в том, чтобы перейти на использование PersistentLocalTimeExact, это работает для меня в условиях, которые я упомянул, и решает все проблемы, которые у меня были с 4 вечера ...

@ Index (name = "bookingStartTimeNumberIndex") @Column (name = "start_time_number", nullable = true) @Type (тип = "org.joda.time.contrib.hibernate.PersistentLocalTimeExact") private LocalTime startTimeNumber;

Ответы [ 3 ]

1 голос
/ 27 декабря 2011

Это звучит как проблема представления данных, а не как фундаментальная проблема, хотя это немного неясно.

Вы говорите, что для записи в базе данных, которая имеет время 0:00 часов,отображается как 16:00 часов, когда вы получите его обратно из базы данных?Если так, то я думаю, что есть некоторая путаница по поводу чтения даты из базы данных, и где-то в расширении Hibernate для Joda Time создается экземпляр LocalTime, предполагая, что время базы данных указано в формате UTC, а затем создается экземпляр LocalTime с вашим локальным часовым поясом.Таким образом, применяя смещение на -8 часов.

Как говорит Эрвин, сохранение часового пояса в базе данных является лучшим способом, или, если вы не можете этого сделать, сохраните только даты и / или время UTC.

Я заглянул на веб-сайт Joda Time , и они рекомендуют другое расширение Hibernate как более поддерживаемое, чем оригинальное, которое вы используете.

Вы также можете попробовать установить точку останова для класса PersistentLocalTimeAsTime и посмотреть, как создается LocalTime.

1 голос
/ 08 января 2012

Могу ли я порекомендовать вам использовать проект Jadira Usertype (отказ от ответственности: я являюсь автором Usertype) - я считаю, что проблема, с которой вы столкнулись, обсуждалась по следующей ссылке:http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

1 голос
/ 27 декабря 2011

Универсальным решением этой проблемы будет использование типа данных отметка времени вместо времени в вашей таблице.Если информация о дате не имеет к вам отношения, вы можете просто выбрать любой фиктивный день, например «2011-11-11 16:00» :: метка времени для 16:00 и «2011-11-11 09:00» :: метка времени для9:00

Или, конечно, есть способы исправить ваш запрос также с типом времени данных ...

Но, во-первых, может ли ваша первоначальная оценка ошибиться?PostgreSQL никогда не будет сортировать time without time zone (или просто time, который по умолчанию совпадает) таким образом.Вы правильно ввели время «4 вечера»?Я подозреваю, что вы ввели «4 утра» по ошибке, или, может быть, вы преобразовали тип данных в текст до сортировки?

Что показывает этот запрос?

SELECT startTime FROM tbl ORDER BY startTime;
...