我试图将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:...设置为零,然后将其保存在数据库中,但我不知道这是否非常明智,关于时区和夏令时以及其他内容。
答案 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);`