return sessionFactory.getCurrentSession().
createQuery("FROM Weather WHERE city_id = :id AND date " +
"BETWEEN now()::date AND now()::date + (:days - 1)").
setInteger("id", city_id).setString("days", days).list();
エラーの発生:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: :
この構文をHQLで使用するにはどうすればよいですか?
基本的に問題は、クエリでコロン(:)を使用したいということですが、hibernateがコロンを見ると、2つのuses(からわかるように、それはparamter(:parameterNameはHQLのパラメーターの構文)であると見なされます。 :id and :days
)。
しかし、now():: dateステートメントを使用している場合、それは特定のpostgreSQL構文であり、休止状態はすべてを台無しにします。
あなたはPostgresを使用しているので、date()を完全に変更します。
return sessionFactory.getCurrentSession().
createQuery("FROM Weather WHERE city_id = :id AND date " +
"BETWEEN current_date AND (current_date + (integer :days - 1))").
setInteger("id", city_id).setString("days", days).list();
http://www.postgresql.org/docs/8.2/static/functions-datetime.html を参照してください
私はちょうどこの問題を抱えていて、キャストを使わなければならなかったので、それを機能させるためにいくつかのことを試みました。脱出することが判明:\
で休止状態
ただし、Javaでは、最初に\
を出力するには、\
でエスケープする必要があります。
したがって、SQL休止状態クエリに:
を入れたい場合は、次のように記述する必要があります:\\:
また、私の場合のようにPostgreSQLでキャストする場合は、たとえば、次のようにする必要があります。field\\:\\:int
フィールドを整数としてキャストする場合。
見てください http://www.postgresql.org/docs/8.1/static/sql-createcast.html
キャストを使用してみてください。私にとって、それは魅力のように機能しました。
return sessionFactory.getCurrentSession().
createQuery("FROM Weather WHERE city_id = :id AND date " +
"BETWEEN cast(now() as date) AND cast(now() as date) + (:days - 1)").
setInteger("id", city_id).setString("days", days).list();