Java 如何在hibernate中比较日期

Java 如何在hibernate中比较日期,java,spring,hibernate,Java,Spring,Hibernate,在我的数据库中,日期为2012-04-09 04:02:53 2012-04-09 04:04:51 2012-04-08 04:04:51等,我需要在日期字段中检索具有当前日期的数据。我的意思是我只需要匹配2012-04-09’。如何使用hibernate标准执行此操作。最简单的方法是获取日期介于给定日期开始和结束之间的所有记录: WHERE date BETWEEN :from AND :to 并在Java代码中计算from和to 对于午夜计算: import static org.apa

在我的数据库中,日期为2012-04-09 04:02:53 2012-04-09 04:04:51 2012-04-08 04:04:51等,我需要在日期字段中检索具有当前日期的数据。我的意思是我只需要匹配2012-04-09’。如何使用hibernate标准执行此操作。

最简单的方法是获取日期介于给定日期开始和结束之间的所有记录:

WHERE date BETWEEN :from AND :to
并在Java代码中计算from和to

对于午夜计算:

import static org.apache.commons.lang.time.DateUtils.ceiling;
import static org.apache.commons.lang.time.DateUtils.truncate;

Date someDay = new Date();
Date from = truncate(someDay, Calendar.DAY_OF_MONTH);
Date to = new Date(ceiling(someDay, Calendar.DAY_OF_MONTH).getTime() - 1);
用于生成日期列介于“2012-04-09 00:00:00”和“2012-04-09 23:59:59”之间的where子句

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date fromDate = df.parse("2012-04-09 00:00:00");
Date toDate = df.parse("2012-04-09 23:59:59");

criteria.add(Restrictions.between("dateField", fromDate, toDate));
请注意,CriteriaAPI中使用的所有属性都是Java属性名,而不是实际的列名

更新:仅使用JDK获取当前日期的fromDate和toDate

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date fromDate = calendar.getTime();

calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Date toDate = calendar.getTime();

criteria.add(Restrictions.between("dateField", fromDate, toDate));

关于如何在Hibernate中实现这一点,已经有人说过了。您可以使用以下方法在Java代码中准备时间戳对象,例如:

Calendar cFrom = Calendar.getInstance();
cFrom.setTime(new Date()); /* today */
cFrom.set(Calendar.HOUR_OF_DAY, 0);
cFrom.set(Calendar.MINUTE, 0);
cFrom.set(Calendar.SECOND, 0);
cFrom.set(Calendar.MILLISECOND, 0);
Timestamp from = new Timestamp(cFrom.getTime().getTime());
Calendar cTo = Calendar.getInstance();
cTo.setTime(new Date()); /* today */
cTo.set(Calendar.HOUR_OF_DAY, 23);
cTo.set(Calendar.MINUTE, 59);
cTo.set(Calendar.SECOND, 59);
cTo.set(Calendar.MILLISECOND, 999);
Timestamp to = new Timestamp(cTo.getTime().getTime());

final String QUERY = ""
  + "SELECT tr "
  + "FROM Type tr "
  + "WHERE tr.timestamp >= :timestampFrom AND tr.timestamp <= :timestampTo";
Query query = entityManager.createQuery(QUERY);
query.setParameter("timestampFrom", from);
query.setParameter("timestampTo", to);
@SuppressWarnings("unchecked")
List<Type> ts = (List<Type>)query.getResultList();
像这样

criteria.add(Expression.eq("yourDate", aDate))
这个代码非常危险。。。如果一天切换到夏令时,例如1980年4月6日,则会出现以下异常

 java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1day


HQL: from human pat where year(pat.birthdate) = :start_day and month(pat.birthdate) = :start_month and year(pat.birthdate) = :start_year ");

params.put("start_day", startDate.get(Calendar.DAY_OF_MONTH));
params.put("start_month", startDate.get(Calendar.MONTH) + 1);
params.put("start_year", startDate.get(Calendar.YEAR));
年/月/日函数使用底层数据库函数extract。。。并仅比较这些值。因此,我不需要将时间设置为0,这将导致上述异常。
这只是我脑海中的一个例子,我是如何解决这个问题的!也许它有帮助

//日期时间比较Hibernate 4.3

     Select c from Customer c where c.date<{d '2000-01-01'}

如何从中获取fromDate和toDateCurrentdate@KenChan非常感谢buddy发布单一日期的日期比较。在parse方法中,我将为23:59:59给出+1。这很有帮助。我认为hibernate应该提供一个函数来比较日期而不是时间,而这个函数适用于所有实际用途。23:59:59还不完全是爆炸物。我会让java帮我解决这个问题:LocalDate.now.atTimeLocalTime.MAX.atzonezonezid.systemDefault.toInstanti-dint获取它。天花板和截断是为了?@Romi:您需要以某种方式计算2012年4月9日星期一00:00:00 CEST一天的开始和2012年4月9日星期一23:59:59 CEST一天的结束。@Romi:是的,截断返回给定一天的开始00:00和天花板-第二天的开始。使用表达式如何。betweenyourDate,aDate,aDate+1这对我不起作用,我认为它确实起了很大作用,比较日期的最佳案例是第一个答案。
fromDate.setTime(new Date());
fromDate.set(Calendar.HOUR_OF_DAY, 0);
fromDate.set(Calendar.MINUTE, 0);
fromDate.set(Calendar.SECOND, 0);
fromDate.set(Calendar.MILLISECOND, 0);
 java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1day


HQL: from human pat where year(pat.birthdate) = :start_day and month(pat.birthdate) = :start_month and year(pat.birthdate) = :start_year ");

params.put("start_day", startDate.get(Calendar.DAY_OF_MONTH));
params.put("start_month", startDate.get(Calendar.MONTH) + 1);
params.put("start_year", startDate.get(Calendar.YEAR));
     Select c from Customer c where c.date<{d '2000-01-01'}