【问题标题】:Hibernate Criteria for Dates日期的休眠条件
【发布时间】:2011-08-13 00:47:58
【问题描述】:

在 oracle 中我有日期格式

2011 年 4 月 17 日 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); 

但它给我带来了空洞的结果:

【问题讨论】:

    标签: java oracle hibernate jakarta-ee criteria


    【解决方案1】:

    试试这个,

        String dateStr = "17-April-2011 19:20:23.707000000 ";
        Date dateForm = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").parse(dateStr);
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");  
    
        String newDate = format.format(dateForm);  
    
        Calendar today = Calendar.getInstance();
        Date fromDate = format.parse(newDate);
        today.setTime(fromDate);
        today.add(Calendar.DAY_OF_YEAR, 1);
        Date toDate= new SimpleDateFormat("dd-MM-yyyy").parse(format.format(today.getTime()));
    
        Criteria crit = sessionFactory.getCurrentSession().createCriteria(Model.class);
        crit.add(Restrictions.ge("dateFieldName", fromDate));
        crit.add(Restrictions.le("dateFieldName", toDate));
        return crit.list();
    

    【讨论】:

      【解决方案2】:

      你为什么用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);
      

      此日期对象等于 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) ); 
      

      【讨论】:

      • 请注意,重要的是要了解,在解析日期时,考虑要解析/格式化 Java 日期的时区可能很重要
      【解决方案3】:

      如果该列是时间戳,您可以执行以下操作:

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

      【讨论】:

        【解决方案4】:

        通过这种方式可以得到选中记录的列表。

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

        所有记录将被生成到列表中大于或等于“2012 年 10 月 8 日”或通过用户接受日期的日期在条件的限制 (gregorianCalendar.getTime()) 的第二个参数处获取记录.

        【讨论】:

          猜你喜欢
          • 2011-09-10
          • 1970-01-01
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-29
          • 1970-01-01
          • 2011-07-14
          相关资源
          最近更新 更多