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
Vous devez vous connecter pour publier un commentaire.
Hibernate a une API particulière pour la spécification de ces concepts lors de l'exécution. Essayez ceci:
Je suppose que la raison pour laquelle il est fait de cette façon est que les éditeurs de bases de données varient grandement quant à savoir comment et où dans la requête SQL ces concepts sont spécifiés, il n'est donc pas raisonnable de choisir un format plutôt qu'un autre, et trop dur pour essayer de convertir entre eux.
De cette façon, le dialecte de la mise en œuvre sait clairement ce qui doit être fait, et on peut ensuite le faire.
OFFSET
etLIMIT
mots-clés font partie de la EJBQL spec. Et si ils sont dans la spec, ils devraient être pris en charge en tant que tel. En outre, si la prise en charge pour eux était d'être abandonné, il doit avoir été totalement abandonnée telle que même l'utilisation de valeurs littérales dans la requête échoue. L'état actuel des choses, où les valeurs littérales de travail et les valeurs paramétrées n'est pas un bug, à mon avis.juste un commentaire supprimé "évident" de la poste
cela m'est arrivé aussi, mais cette fois, c'est une chaîne de param valeur. Il fonctionne très bien si je remplace le paramètre par valeur... je pense qu'il y a une autre erreur, derrière ce fait
OriginalL'auteur Bohemian