在甲骨文我有格式的日期
2011年4月17日19:20:23.707000000
我想检索2011年4月17日的所有订单。
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);
但这给我带来了空洞的结果:
为什么使用Restrictions.like(...)?
Restrictions.like(...
您应该使用Restrictions.eq(...)。
Restrictions.eq(...)
请注意,您也可以使用.le,.lt,.ge,.gt在日期对象作为比较操作。LIKE运算符不适用于这种情况,因为LIKE当您要根据列的部分内容匹配结果时很有用。请参阅http://www.sql- tutorial.net/SQL-LIKE.asp作为参考。
.le
.lt
.ge
.gt
LIKE
例如,如果您的姓名列中包含某些人的全名,则可以这样做,where name like 'robert %'以便您返回名称以'robert '(%可以替换任何字符)开头的所有条目。
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);
此日期对象等于07:00、0分,0秒和0纳秒的17-04-2011。
这意味着您在数据库中的条目必须具有 确切的 日期。我的意思是,如果您的数据库条目的日期为“ 17-April-2011 19:20:23.707000000”,那么它将不会被检索,因为您只要求输入该日期:“ 17-April-2011 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) );