HQL where子句'大于'与jadira PersistentDateTimeWithZone

时间:2013-05-20 09:31:31

标签: hibernate jodatime

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

3 个答案:

答案 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();