在JPA2(JPQL)中仅比较日期(没有时间)

时间:2011-05-04 15:39:24

标签: datetime jpa date jpa-2.0 jpql

我试图将Calendar与JPA2进行比较。查询看起来有点像:

TypedQuery<X> q = em.createQuery("select r from Record r where r.calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c);

但是,这会比较日期+时间。我想知道MM:DD:YYYY是否相等而且不关心时间。有没有一种很好的方法在JPA2中做到这一点,还是我必须创建一个本机查询?

我尝试将HH:MM:SS:...设置为零,然后将其保存在数据库中,但我不知道这是否非常明智,关于时区和夏令时以及其他内容。

6 个答案:

答案 0 :(得分:26)

q.setParameter("calendar", c, TemporalType.DATE)

您可以将TemporalType.DATE传递给setParameter方法以截断日期+时间。

答案 1 :(得分:8)

没有提到DateTime函数允许在JPQL的规范中这样做,但是你总是可以作弊而且

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock

答案 2 :(得分:1)

使用Oracle数据库时,可以在JPQL查询中使用TypedQuery<X> q = em.createQuery("select r from Record r where trunc(r.calendar) = trunc(:calendar)", X.class); 函数,例如:

{{1}}

另请参阅https://cirovladimir.wordpress.com/2015/05/18/jpa-trunc-date-in-jpql-query-oracle/

答案 3 :(得分:0)

我不得不在where子句中使用date_trunc:

    TypedQuery<X> q = em.createQuery("select r from Record r where date_trunc('day',r).calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c, TemporalType.DATE);

答案 4 :(得分:0)

我的解决方案适用于spring data jpa @query:

select * from table_name where substring(something.date, 1,10) = substring(date_from_param, 1,10)

它工作正常,但您必须确保日期始终格式正确。

答案 5 :(得分:0)

Mysql和H2兼容的日期比较,忽略时间部分:

`@Query("SELECT DISTINCT s " +
        "FROM Session s " +
        "JOIN s.movie m " +
        "WHERE m.id = :movie AND CAST(s.time AS date) = CAST(:date AS date) " +
        "ORDER BY s.time")
List<Session> getByMovieAndDate(@Param("movie") Long movie, @Param("date") LocalDateTime date);`