web-dev-qa-db-ja.com

Hibernateクエリの使用:コロンはパラメーターとして扱われます/コロンをエスケープします

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構文であり、休止状態はすべてを台無しにします。

23
Jaanus

あなたは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 を参照してください

4
atrain

私はちょうどこの問題を抱えていて、キャストを使わなければならなかったので、それを機能させるためにいくつかのことを試みました。脱出することが判明:\で休止状態

ただし、Javaでは、最初に\を出力するには、\でエスケープする必要があります。
したがって、SQL休止状態クエリに:を入れたい場合は、次のように記述する必要があります:\\:

また、私の場合のようにPostgreSQLでキャストする場合は、たとえば、次のようにする必要があります。field\\:\\:intフィールドを整数としてキャストする場合。

41
SwampDev

見てください http://www.postgresql.org/docs/8.1/static/sql-createcast.html

キャストを使用してみてください。私にとって、それは魅力のように機能しました。

3
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();
0
carlos.romel