2011-04-26 82 views
21

在oracle中我有格式的日期Hibernate的标准日期

17月2011年19:20:23.707000000

我想检索所有订单17-04-2011。

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); 
String myDate = "17-04-2011"; 
Date date = formatter.parse(myDate); 
    Criteria criteria = 
       session.createCriteria(Order.class); 
Criterion restrictDate = Restrictions.like("orderDate",date); 

,但它带给我空的结果:

回答

43

为何使用Restrictions.like(...)?您可以使用Restrictions.eq(...)

请注意,您还可以使用.le,.lt,.ge,.gt作为比较运算符的日期对象。 LIKE运算符不适合这种情况,因为LIKE在您想根据列的部分内容匹配结果时非常有用。 请参阅http://www.sql-tutorial.net/SQL-LIKE.asp以供参考。

例如,如果你有一些人的全名的名称栏,你可以做where name like 'robert %',这样你将返回名称以'robert '所有条目(%可以代替任何字符)。

就你而言,你知道你试图匹配的日期的全部内容,所以你不应该使用LIKE,而是平等。我猜Hibernate在这种情况下不会给你任何例外,但无论如何,你可能会遇到与Restrictions.eq(...)相同的问题。

你的代码有

你的约会对象:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); 
String myDate = "17-04-2011"; 
Date date = formatter.parse(myDate); 

此Date对象是等于在17-04-2011在0H,0分0秒和0纳秒。

这意味着您在数据库中的条目必须有,该日期恰好为。我的意思是,如果你的数据库条目有一个日期“2011年4月17日19:20:23.707000000”,那么它将不会被检索,因为你只是要求这个日期:“2011年4月17日00:00: 00.0000000000" 。

如果你想从某一天检索数据库的所有条目,你将不得不使用下面的代码:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY"); 
    String myDate = "17-04-2011"; 
    // Create date 17-04-2011 - 00h00 
    Date minDate = formatter.parse(myDate); 
    // Create date 18-04-2011 - 00h00 
    // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class 
    Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1)); 
    Conjunction and = Restrictions.conjunction(); 
    // The order date must be >= 17-04-2011 - 00h00 
    and.add(Restrictions.ge("orderDate", minDate)); 
    // And the order date must be < 18-04-2011 - 00h00 
    and.add(Restrictions.lt("orderDate", maxDate)); 
+2

需要注意的是要明白,当你分析一个日期可能考虑要在其中解析时区是很重要很重要/格式Java日期 – 2014-09-12 17:01:52

5

通过使用这种方式,你可以得到的选定记录列表。

GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
Criteria cri = session.createCriteria(ProjectActivities.class); 
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime())); 
List list = cri.list(); 

所有记录将被生成到列表,它是大于或等于08 - 辛2012' 或者通过用户的认可日期的日期在(gregorianCalendar.getTime())限制的第二参数的标准,以获得记录。

1

如果列是一个时间戳,你可以做到以下几点:

 if(fromDate!=null){ 
      criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')")); 
     } 
     if(toDate!=null){    
      criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')")); 
     } 

     resultDB = criteria.list();