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

datetime jpa date jpa-2.0 jpql

35316 观看

6回复

8146 作者的声誉

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

作者: atamanroman 的来源 发布者: 2011 年 5 月 4 日

回应 (6)


8

560614 作者的声誉

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

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
作者: JB Nizet 发布者: 04.05.2011 04:04

26

964 作者的声誉

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

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

作者: Otávio Garcia 发布者: 08.05.2011 03:58

0

12 作者的声誉

我不得不在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);
作者: Roger 发布者: 19.02.2014 02:53

0

1302 作者的声誉

我的解决方案使用了spring数据jpa @query:

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

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

作者: RichardK 发布者: 07.11.2016 09:09

1

11 作者的声誉

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);`
作者: pshvetso 发布者: 09.01.2019 02:26

1

11 作者的声誉

使用Oracle数据库时,可以trunc在JPQL查询中使用该函数,例如:

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/

作者: Pierre 发布者: 07.05.2019 12:38
32x32