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

bsxbgnwa  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(196)

我试图将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:...设置为零,然后再保存到数据库中,但我不知道这是否是非常明智的,关于时区和夏令时和东西。

lvmkulzt

lvmkulzt1#

使用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/

ajsxfq5m

ajsxfq5m2#

我不得不在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);
aelbi1ox

aelbi1ox3#

在Hibernate 6及更高版本中,可以使用date_trunc(text, timestamp)更精确地截断时间戳,例如:
date_trunc('hour', timestamp)将时间戳截断到小时(没有分钟和秒)。

liwlm1x9

liwlm1x94#

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

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

vc6uscn9

vc6uscn95#

在JPQL的规范中没有提到允许这样做的DateTime函数,但是您总是可以欺骗并这样做

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

flseospp6#

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

相关问题