Hibernate: ne Peut pas utiliser un paramètre nommé pour OFFSET et de la LIMITE?

Je vais essayer d'obtenir les suivantes NamedQuery de travail:

@NamedQuery(name="MyEntity.findByUser", query="SELECT m FROM MyEntity m WHERE m.owner = :user OFFSET :offset LIMIT :limit")

Le problème est que cela provoque Hibernate exploser avec la pile suivant à la trace lors du démarrage du serveur:

[INFO] [talledLocalContainer] java.lang.NullPointerException
[INFO] [talledLocalContainer]   at org.hibernate.hql.ast.ParameterTranslationsImpl.getNamedParameterExpectedType(ParameterTranslationsImpl.java:63)
[INFO] [talledLocalContainer]   at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:296)
[INFO] [talledLocalContainer]   at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:97)
[INFO] [talledLocalContainer]   at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
[INFO] [talledLocalContainer]   at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
[INFO] [talledLocalContainer]   at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:400)
[INFO] [talledLocalContainer]   at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:351)
[INFO] [talledLocalContainer]   at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
[INFO] [talledLocalContainer]   at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
[INFO] [talledLocalContainer]   at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
[INFO] [talledLocalContainer]   at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
[INFO] [talledLocalContainer]   at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
(...)

Après quelques tâtonnements, j'ai trouvé que le fait de remplacer ":offset" et ":" de limite avec des valeurs littérales (0 et 10, respectivement) a bien fonctionné. Est-il une raison pour cela, et est-il un moyen pour obtenir les paramètres nommés pour travailler dans ma requête?

J'ai vu quelques autres exemples d'utilisation positionné paramètres pour définir dynamiquement le décalage et la limite des valeurs dans une requête nommée, mais je préfère ne pas avoir mon code de dégénérer en un tas de illisible query.setParameter(1, "someValue"); non-sens. Les paramètres nommés étaient censés se débarrasser de ce genre de déchets code.

OriginalL'auteur aroth | 2011-07-04