2010-05-19 96 views
1

我需要編寫一個查詢來獲得一定範圍的時間之間的對象,目前查詢是這樣的:HQL(休眠)日期和時間範圍內的比賽

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:意外的標記:16附近線1,列123 [從人毫升其中ml.lastModifiedOn> = 2010-02-12 16:00:21.292和m1.lastModifiedOn
+0

試YYYY-MM-DD HH:MM:SS – Inv3r53 2010-05-19 11:27:47

+0

不起作用。 。 – Saky 2010-05-19 11:53:04

回答

3

您在當前查詢中缺少單引號。下面應該工作:

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在這裏?如果是的話,你不應該。

+0

是的,我基本上在整個項目中使用時間戳,雖然這工作: 時間戳從= ..; 時間戳= =; DetachedCriteria criteria = DetachedCriteria.forClass(Person.class); criteria.add(限制之間(「lastModifiedOn」,from,to)); 列表 results = getHibernateTemplate()。findByCriteria(criteria); – Saky 2010-07-01 14:18:41

2

如果在DB中表示爲long,則只需在比較中傳遞longfrom.getTime())即可。

否則,你可以使用這些functiomns:second(...), minute(...), hour(...), day(...), month(...), and year(...)

+1

在數據庫中,它表示爲DATETIME而不是很長。 我如何在整個日期時間匹配中使用這些函數? – Saky 2010-05-19 11:42:36

1

怎麼這樣呢?

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

    getHibernateTemplate().find(sql, new Object[] {from,to}); 
+0

我試過了,我得到一個錯誤。 [錯誤] 13:58:03 PARSER-無效的路徑:'m1.lastModifiedOn' [錯誤] 13:58:03 PARSER - :0:0:子樹的意外結束 [錯誤] 13:58:03 PARSER - 二元運算符的左側操作數爲null org.springframework.orm.hibernate3.HibernateQueryException:無效路徑:'m1.lastModifiedOn'[from it.Person ml where ml.lastModifiedOn> =?和m1.lastModifiedOn <=?];嵌套異常是org.hibernate.hql.ast.QuerySyntaxException:路徑無效:'m1.lastModifiedOn'[from it.Person ml where ml.lastModifiedOn> =?和m1.lastModifiedOn <=?] ... 奇怪! – Saky 2010-06-04 13:29:44

0

如果您想查詢的東西之間,你可以做到以下幾點:

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,無論你正在使用