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

问题描述 投票:0回答:6

我正在尝试将

Calendar
s 与 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:... 设置为零,然后将其保存在数据库中,但我不知道这是否非常明智,关于时区和夏令时等等。

datetime jpa date jpa-2.0 jpql
6个回答
28
投票
q.setParameter("calendar", c, TemporalType.DATE)

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


8
投票

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

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

7
投票

忽略时间部分的日期的 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);`

5
投票

使用 Oracle 数据库时,可以在 JPQL 查询中使用

trunc
函数,例如:

TypedQuery<X> q = em.createQuery("select r from Record r where trunc(r.calendar) = trunc(:calendar)", X.class);

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


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);

0
投票

在Hibernate 6及以上版本,可以使用

date_trunc(text, timestamp)
更精确的截断时间戳,例如:

date_trunc('hour', timestamp)
将时间戳截断到小时(没有分钟也没有秒)。

© www.soinside.com 2019 - 2024. All rights reserved.