Совпадение диапазона временных меток HQL (спящий режим)

Мне нужно написать запрос, чтобы получить объект между диапазоном времени, в настоящее время запрос выглядит так:

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

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

However, this doesnot work for obvious reasons. How can I format the timestamp to be acceptable by the query.

org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: 16 near line 1, column 123 [from Person ml where ml.lastModifiedOn>=2010-02-12 16:00:21.292 and m1.lastModifiedOn

person Saky    schedule 19.05.2010    source источник


Ответы (4)


В текущем запросе отсутствуют одинарные кавычки. Следующее должно работать:

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 здесь? Если да, то не должны.

person Pascal Thivent    schedule 19.05.2010
comment
Да, я использую Timestamp в основном во всем проекте, и хотя это работает: Timestamp from =..; Временная метка = ..; Критерии DetachedCriteria = DetachedCriteria.forClass(Person.class); Критерии.добавить(Ограничения.между(последнееизменено,от,до)); List‹Person› results = getHibernateTemplate().findByCriteria(criteria); - person Saky; 01.07.2010

Вы можете просто передать long (from.getTime()) в сравнении, если он представлен в БД как длинный.

В противном случае вы можете использовать эти функции: second(...), minute(...), hour(...), day(...), month(...), and year(...)

person Bozho    schedule 19.05.2010
comment
В БД он представлен как DATETIME, а не как длинный. Как бы я использовал эти функции для всего совпадения даты и времени? - person Saky; 19.05.2010

Как насчет чего-то подобного?

    String sql = "from " + Person.class.getName() + " ml where ml.lastModifiedOn>= ? and m1.lastModifiedOn<= ?";
    Date from = ...;
    Date to = ...;

    getHibernateTemplate().find(sql, new Object[] {from,to});
person limc    schedule 19.05.2010
comment
Я попробовал это, и я получаю сообщение об ошибке. [ОШИБКА] 13:58:03 PARSER - Неверный путь: 'm1.lastModifiedOn' [ОШИБКА] 13:58:03 PARSER - ‹AST›:0:0: неожиданный конец поддерева [ОШИБКА] 13:58:03 PARSER - левый операнд бинарного оператора был нулевым и m1.lastModifiedOn‹=?]; вложенным исключением является org.hibernate.hql.ast.QuerySyntaxException: неверный путь: 'm1.lastModifiedOn' [от it.Person мл, где ml.lastModifiedOn›=? и m1.lastModifiedOn‹=?] ... странно! - person Saky; 04.06.2010

Если вы хотите запросить что-то между ними, вы можете сделать следующее:

 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 на то, что вы используете.

person Shervin Asgari    schedule 19.05.2010