我正在使用jadira PersistentDateTimeWithZone来存储带有时区的joda DateTime。这一切都按预期工作,除了使用“> =”搜索日期 - 它比较where子句中的时间时区字符串(请参阅底部的SQL)。有没有办法进一步改进我的注释或HQL以防止这种情况,或者它是Jadira中的错误
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTimeWithZone")
@Columns(columns={@Column(name="departureDate", nullable = false),@Column(name="departureDateTimezone", nullable = false)})
private DateTime depScheduled;
我的JpaRepository中的HQL查询:
/**
* Get all things that depart after the given date
*/
@Query("select e from MyTable e where depScheduled>=?1")
List<MyTable> loadDatFromMyTable(DateTime depDate);
生成的SQL - 看到它正在尝试比较日期和时区字符串(:
Hibernate:
select
x.departureDate as departur5_4_,
x.departureDateTimezone as departur6_4_,
from
MyTable x
where
and crewroster0_.departureDate>=?
and crewroster0_.departureDateTimezone>=?
答案 0 :(得分:1)
该类型实际上是一个Hibernate CompositeType(与所有Jadira多列类型一样)。这使您可以查询该类型的组件。对于这种类型,两个组件是:'datetime'和'offset',因此,尝试将类型中的组件称为depScheduled.datetime。
在http://learningviacode.blogspot.co.uk/2011/09/creating-hibernate-custom-type-2.html
上对CompositeTypes进行了很好的讨论答案 1 :(得分:1)
我无法让任何解决方案正常工作。所以我将我的列留作DateType并在加载数据后设置所需的时区。就我而言,我计算了该城市的时区。
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private LocalDate myDateTime;
@Column(type="String")
private String city;
@PostLoad
public void postLoad() {
DateTimeZone = getTimeZoneFrom(this.city);
MutableDateTime mdt = new MutableDateTime(this.myDateTime);
mdt.setZone(dateTimeZone);
this.myDateTime = mdt.toDateTime();
}
答案 2 :(得分:0)
对于那个hql查询,你不能.setDate()吗?
因为您必须将日期作为对象输入,而不是作为本机查询中的字符串输入。
你可以尝试一下这样的事情:Date x = //your date
String hql = "from MyTable e where depScheduled>=:givenDate";
List<MyTable> myTable = yourSession.createQuery(hql).setDate("givenDate", x).list();