我试图在我的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
有人可以告诉我,我在做错了什么/在这里失踪了吗?
答案 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();
希望这会有所帮助.. !!