我正在尝试将
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:... 设置为零,然后将其保存在数据库中,但我不知道这是否非常明智,关于时区和夏令时等等。
q.setParameter("calendar", c, TemporalType.DATE)
您可以将 TemporalType.DATE 传递给 setParameter 方法以截断日期和时间。
在 JPQL 的规范中没有提到 DateTime 函数允许这样做,但你总是可以作弊
select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
忽略时间部分的日期的 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);`
使用 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/
我必须在 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);
在Hibernate 6及以上版本,可以使用
date_trunc(text, timestamp)
更精确的截断时间戳,例如:
date_trunc('hour', timestamp)
将时间戳截断到小时(没有分钟也没有秒)。