【问题标题】:Compare date's date part only with Timestamp in Hibernate仅将日期的日期部分与 Hibernate 中的时间戳进行比较
【发布时间】:2012-01-23 10:06:24
【问题描述】:

我在数据库中有时间戳,在应用程序中我有日期。我喜欢编写休眠标准,这样休眠可以提取所有与日期匹配的条目,而不是时间部分。 例如

在数据库时间戳中

2011-12-01 15:14:14

在应用程序中,我确实有 java.util.Date,它默认具有时间部分。

我的问题是,当我使用以下代码从数据库中搜索条目时,我什么也得不到

    DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class);
    criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate));
    List entries =this.getHibernateTemplate().findByCriteria(criteria);

提前致谢

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果您正在寻找按日期范围过滤的一般用途(例如,从今天到明天)。 我就是这样用的:

    YourService.java

    Date fromTimestamp = new Date();
    Date toTimestamp = new Date();
    Date fromDate = DateHelper.getDateWithoutTime(fromTimestamp);
    Date toDate = DateHelper.getDateWithoutTime(DateHelper.getTomorrowDate(toTimestamp));
    

    你的DAO.java

    criteria.add(Restrictions.ge(TIMESTAMP_FIELD, fromDate));
    criteria.add(Restrictions.le(TIMESTAMP_FIELD, toDate));
    

    DateHelper.java

    public static Date getDateWithoutTime(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
    
    public static Date getTomorrowDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, 1);
        return cal.getTime();
    }
    

    当然 - 每个代码中总是有重构的空间。

    【讨论】:

      【解决方案2】:

      like 运算符只能用于字符串值。约会没有意义。

      如果您的日期为 2011-12-01(假设此处为 yyyy-MM-dd),并且您想要所有在这一天有其时间戳的行,那么您将搜索时间戳为 >= 2011-12-01 的所有行,并且< 2011-12-02.

      因此,将 1 天添加到您的日期(使用临时日历对象),并使用以下代码:

      criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate));
      criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay));
      

      【讨论】:

      • 如果我将日期转换为字符串,那么它会显示 2011-12-11 02:00:00',如果我减去或添加一天,那么我的查询将不会得出合理的结果。这样,由于时间部分,我将在指定日期之前获得那些谎言的条目。
      • 使用适当的日期限制。将所有时间字段(小时、分钟、秒、毫秒)设置为 0。这就是下限。加一天。这就是上限。
      【解决方案3】:
      if (model.getFromDOE() != null) {
              criteria.add(Restrictions.ge("createdDate",
                      getFormattedFromDateTime(model.getFromDOE())));
          }
      
          if (model.getToDOE() != null) {
              criteria.add(Restrictions.le("createdDate",
                      getFormattedToDateTime(model.getToDOE())));
          }
      
      private Date getFormattedFromDateTime(Date date) {
          Calendar cal = Calendar.getInstance();
          cal.setTime(date);
          cal.set(Calendar.HOUR_OF_DAY, 0);
          cal.set(Calendar.MINUTE, 0);
          cal.set(Calendar.SECOND, 0);
          return cal.getTime();
      }
      
      private Date getFormattedToDateTime(Date date) {
          Calendar cal = Calendar.getInstance();
          cal.setTime(date);
          cal.set(Calendar.HOUR_OF_DAY, 23);
          cal.set(Calendar.MINUTE, 59);
          cal.set(Calendar.SECOND, 59);
          return cal.getTime();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 2019-05-23
        相关资源
        最近更新 更多