HQL查询两个日期之间的记录

时间:2014-01-21 17:30:18

标签: spring hibernate hql

我试图在我的Spring / Hibernate应用程序中使用HQL查询所有客户记录,其中Date1和Date2之间的DateAdded或Date1和Date2之间的LastSeen,所以我在Repository / DAO类中构建了这个HQL查询:

sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN  '"+startDate+"' AND '"+endDate+"'").list();

我调试了应用以检查startDate和endDate,发现它们是以:

发送的

startDate:Wed 1月22日01:16:57 HKT 2014

endDate:Wed Jan 29 01:16:57 HKT 2014

在DB中,我100%确定至少有一条记录符合此查询,因为此记录DateAdded和LastSeen如下:

2014-01-23 15:33:38

2014-01-25 15:33:38

有人可以告诉我,我在做错了什么/在这里失踪了吗?

7 个答案:

答案 0 :(得分:16)

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate);
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setParameter("stDate", frmDate)
.setParameter("edDate", enDate)
.list();
希望这会有所帮助!

答案 1 :(得分:6)

这是一篇旧帖子,但我认为这可能对某人有所帮助。设置.setTimeStamp应该可以解决问题。

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate); 
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setTimestamp("stDate", frmDate)
.setTimestamp("edDate", enDate)
.list();

答案 2 :(得分:2)

SimpleDateFormat sf=new SimpleDateFormat("dd-MM-YYYY");
String fromDate=null;
String toDate=null;
fromDate=sf.format(startDate);
toDate=sf.format(endDate);
sessionfactory.getCurrentSession().createQuery("from Customer where dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"'");

答案 3 :(得分:0)

我有类似的问题。当我们使用结束日期(1月29日星期三)时,系统会查找Wed Jan 29 00:00:00,就像选择1月28日一样。为了避免这种情况,我们可以在结束日期添加一天。这也解释了为什么我们没有开始日期的问题。

令人惊讶的是,当我们使用hibernate标准时,这个问题不存在。

答案 4 :(得分:0)

SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
    Calendar c = Calendar.getInstance();
    c.setTime(new Date()); // Now use today date.
    c.add(Calendar.DATE, 90);
    Date fromDate = null, toDate = null;
    String fromDateStr = formatter.format(new Date());
    String toDateStr = formatter.format(c.getTime());
    try {
        fromDate = formatter.parse(fromDateStr);
        toDate = formatter.parse(toDateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    query.setParameter("stDate", fromDate);
    query.setParameter("edDate", toDate);

答案 5 :(得分:0)

您需要使用@JsonFormat进行注释,方法与日期过滤器和日期字段相同,如下所示:

Class Filter {
...
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date startDate;
}

Class YourObject {
...

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date DateAdded;
}

模式和时区应根据您所在的地区进行调整。

答案 6 :(得分:-1)

尝试这样的事情:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date fromDate = df.parse(startDate);
Date toDate = df.parse(endDate);
Criteria criteria = sessionfactory.getCurrentSession().createCriteria(Customer.class)
   .add(Restrictions.between("dateAdded", fromDate , toDate ));
List<Customer> listCustomer = criteria.list();

希望这会有所帮助.. !!