2011-12-04 215 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