2011-12-04 216 views
1

我想要做的事情在sql中非常簡單,但我無法使它與JPQL一起工作。JPQL時間間隔

問題是我的日期格式不匹配。在我的數據庫中的日期存儲像2011-12-04 18:19:00

我已經試過是:

Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.SECOND, -GlobalConfig.heartbeatInterval); 
    Query query = JPA.em().createQuery("select uo from UserOnline uo where lastActive < " + cal.getTime()); 

但是,這是給我這個錯誤:IllegalArgumentException occured : org.hibernate.hql.ast.QuerySyntaxException: unexpected token: Dec near line 1, column 60 [select uo from models.UserOnline uo where lastActive < Sun Dec 04 19:22:17 CET 2011]

任何想法?

+0

在您的數據庫中,日期不會像2011-12-04 18:19:00存儲。它存儲在二進制形式,並顯示您的數據庫瀏覽工具2011-12-04 18:19:00使其可讀。 –

回答

2

當您執行「QueryText」+ cal.getTime()時,您告訴Java將cal.getTime()轉換爲String並將其附加到查詢文本。您可以在例外情況下清楚地看到它,它提供了它嘗試的查詢...

select uo from models.UserOnline uo where lastActive < Sun Dec 04 19:22:17 CET 2011 

請參閱? 'Sun Dec 04 19:22:17 CET 2011'僅僅是一堆文本,而Hibernate的查詢引擎不知道如何解析它。

我會稍微改變您的查詢採取一種說法,這是時間...

Query query = JPA.em().createQuery("select uo from UserOnline uo where lastActive < :lastActive"); 
query.setParameter("lastActive", cal.getTime()); 

編輯:從JB Nizet接過意見,改變了這個編號爲命名參數。

+3

+1:更好的是,使用命名參數:「where lastActive <:limit」並使用setParameter(「limit」,cal.getTime())。 –

+0

是的,好點。 – Todd