2011-12-04 21 views
1

私がやろうとしていることはSQLではかなりシンプルですが、JPQLで動作するようにはできません。JPQLの時間間隔

問題は、私の日付形式が互いに一致しないことです。

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]

任意のアイデア?私のデータベースでは、日付は2011-12-04 18:19:00

私が試したことはあるように保存されていますか

+0

データベースでは、日付は2011-12-04 18:19:00のように保存されません。これはバイナリ形式で保存され、データベースブラウズツールで2011-12-04 18:19:00に表示され、読みやすくなります。 –

答えて

2

"QueryText" + cal.getTime()を実行すると、cal.getTime()をStringに変換してクエリテキストに追加するようJavaに指示します。あなたは例外でそれをはっきりと見ることができます。それは試みたクエリを提供しました...

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のクエリエンジンはそれを解析する方法を知らない。 JB Nizetからアドバイスを取って、名前付きパラメータへの番号からこれを変更:

私は

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

EDITが...時間で引数を取るために少しあなたのクエリを変更します。

+3

+1:名前付きパラメータを使用する方が良い: "lastActive <:limit"とsetParameter( "limit"、cal.getTime())を使用する。 –

+0

はい、良い点。 – Todd