2014-01-21 63 views
10

我想在我的Spring/Hibernate应用程序中使用HQL查询所有客户记录,这些记录在Date1和Date2之间或Date1和Date2之间有LastSeen,所以我在这个HQL查询中创建了这个HQL查询存储库/ DAO类:HQL查询两个日期之间的记录

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

我调试的应用程序来检查起始日期和结束日期,发现它们发送为:

开始日期:星期三1月22日1时16分57秒香港时间2014

结束日期:Wed Jan 29 01:16:57 HKT 2014

在DB,我100%肯定有一个记录至少会这个查询,因为这是记录和DateAdded LastSeen如下:

2014年1月23日15时33分38秒

2014 -01-25 15:33:38

那么有人可以告诉我我在做什么错误/在这里失踪?

+2

我不确定在日期作为文件传递时如何在HQL中处理时区,但是您应该*真正*使用查询参数而不是字符串连接。 – Guillaume

+0

@Guillaume这是专门解决这个问题还是一般来说? – MChan

+0

@Guillaume将其更改为sessionfactory.getCurrentSession()。createQuery(“from Customer c where c.dateAdded BETWEEN:startD AND:endD”).setParameter(“startD”,startDate).setParameter(“endD”,startDate).list ();并仍然不会工作:( – MChan

回答

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

希望这有助于.. !!

+1

这将无法正常工作,因为您将格式化日期返回到Date对象的所有格式都不见了 – MChan

10
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(); 

希望这会有所帮助!

+0

这不会工作,因为你返回格式化日期回到日期对象所有格式不见了 – MChan

+0

@MChan检查我的更新 –

+0

这也不会工作:(因为setParameter将检查传递的变量类型。因此它会引发在String和Date之间失败的例外,即使你试图在setParameter中投射,它也不会起作用 – MChan

5

这是一个旧帖子,但我想它可能有助于某人。设置.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
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+"'"); 
+1

你应该解释你的答案,而不仅仅是邮政编码。 – Martin

0

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

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

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); 
相关问题