1

我正在使用 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>=? 
4

3 回答 3

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();
 }
于 2013-07-04T09:09:14.747 回答
1

该类型实际上是一个 Hibernate CompositeType(就像所有的 Jadira 多列类型一样)。这使您可以查询类型的组件。对于这种类型,两个组件是:“datetime”和“offset”,因此,请尝试将类型中的组件称为 depScheduled.datetime。

有一个关于 CompositeTypes 的很​​好的讨论:http: //learningviacode.blogspot.co.uk/2011/09/creating-hibernate-custom-type-2.html

于 2013-06-29T12:12:56.100 回答
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();
于 2013-06-30T11:28:27.263 回答