【问题标题】:HQL(hibernate) timestamp range matchHQL(hibernate) 时间戳范围匹配
【发布时间】:2010-05-19 11:10:46
【问题描述】:

我需要编写一个查询来获取一个时间范围内的对象,目前查询如下所示:

Timestamp from = ... 
Timestamp to = ...

getHibernateTemplate().find("from " + Person.class.getName() + " ml where ml.lastModifiedOn>="+from.toString()+" and m1.lastModifiedOn<=" + to.toString());

但是,由于显而易见的原因,这不起作用。如何格式化时间戳以使查询可以接受。

org.springframework.orm.hibernate3.HibernateQueryException:意外令牌:第 1 行第 123 列附近的 16 [来自 Person ml where ml.lastModifiedOn>=2010-02-12 16:00:21.292 和 m1.lastModifiedOn

【问题讨论】:

    标签: java hibernate timestamp hql


    【解决方案1】:

    当前查询中缺少单引号。以下应该有效:

    from Person ml where ml.lastModifiedOn 
    between '2010-02-12 16:00:21.292' and '2010-02-12 23:00:21.292' 
    

    请注意,我不知道您为什么不将 Date 实例传递给以下查询:

    from Person ml where ml.lastModifiedOn between :from and :to 
    

    您在这里使用java.sql.Timestamp 吗?如果是,您不应该这样做。

    【讨论】:

    • 是的,我基本上在整个项目中都在使用 Timestamp,尽管这有效: Timestamp from =..;时间戳 = ..; DetachedCriteria 标准 = DetachedCriteria.forClass(Person.class); criteria.add(Restrictions.between("lastModifiedOn", from, to)); List 结果 = getHibernateTemplate().findByCriteria(criteria);
    【解决方案2】:

    您可以在比较中简单地传递一个long (from.getTime()),如果它在 DB 中表示为 long。

    否则你可以使用这些函数:second(...), minute(...), hour(...), day(...), month(...), and year(...)

    【讨论】:

    • 在数据库中它表示为 DATETIME 而不是那么长。我如何将这些函数用于整个日期时间匹配?
    【解决方案3】:

    这样的事情怎么样?

        String sql = "from " + Person.class.getName() + " ml where ml.lastModifiedOn>= ? and m1.lastModifiedOn<= ?";
        Date from = ...;
        Date to = ...;
    
        getHibernateTemplate().find(sql, new Object[] {from,to});
    

    【讨论】:

    • 我试过了,但我得到了一个错误。 [错误] 13:58:03 解析器 - 无效路径:'m1.lastModifiedOn' [错误] 13:58:03 解析器 - :0:0:子树意外结束 [错误] 13:58:03 解析器 -二元运算符的左操作数为空 org.springframework.orm.hibernate3.HibernateQueryException: Invalid path: 'm1.lastModifiedOn' [from it.Person ml where ml.lastModifiedOn>=?和 m1.lastModifiedOn=?和 m1.lastModifiedOn
    【解决方案4】:

    如果您想查询两者之间的内容,可以执行以下操作:

     public List findPerson() {
       Date from = ...;
       Date to = ...;
       return entityManager.createQuery(
         "SELECT p from Person p WHERE p.lastModifiedOn BETWEEN ?1 AND ?2")
         .setParameter(1,from, TemporalType.DATE)
         .setParameter(2,to, TemporalType.DATE).getResultList();
    }
    

    您可能需要将TemporalType.DATE 更改为您正在使用的任何内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2015-01-23
      • 2020-02-04
      相关资源
      最近更新 更多