Utilisation de la requête Hibernate: le côlon est traité comme paramètre / Echappement du côlon
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();
erreur:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: :
Comment puis-je utiliser cette syntaxe dans HQL?
fondamentalement, le problème est que je veux utiliser colon (:) Dans ma requête, mais quand hibernate voit colon, il pense que c'est un paramétreur (: parameterName est la syntaxe pour les paramètres dans HQL), comme vous pouvez le voir à partir de mes 2 Utilisations ().
mais quand j'utilise now ():: date statement, c'est la syntaxe spécifique postgreSQL, hibernate ruine tout.
6 réponses
puisque vous êtes sur Postgres, je changerais la date() complètement:
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();
voir http://www.postgresql.org/docs/8.2/static/functions-datetime.html
je viens d'avoir ce problème, il fallait utiliser des moulages, alors j'ai essayé quelques trucs pour le faire fonctionner. Il s'avère que vous vous échappez : en hibernation avec \
Cependant, en java, pour imprimer \
pour commencer, vous avez à s'échapper avec \
.
Donc, si vous voulez mettre un :
dans votre requête SQL hibernate, vous devez l'écrire comme:\:
Et si vous avez voulu jeter dans PostgreSQL, comme dans mon cas, il vous faudrait, par exemple: field\:\:int
si vous voulais pour lancer un champ comme un entier.
regardez http://www.postgresql.org/docs/8.1/static/sql-createcast.html
essayez d'utiliser cast. Pour moi, il a travaillé comme un charme.
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();
Vous échapper :
::
. Je pense que.
ou essayez un nativequery