Dynamiquement le tri des NamedQuery? Couture/Hibernate/JPA
J'ai plusieurs NamedQuery
's définie, et je voudrais être en mesure d'effectuer un tri sur un champ d'une entité, de manière dynamique, sans avoir à créer unique NamedQuery
's pour chaque domaine je veux. Par exemple:
J'ai une entité appelée MyObject, avec des champs 'a', 'b' et 'c'. Ma requête de base est "SELECT DISTINCT o FROM MyObject o
", mais je voudrais être en mesure d'ajouter un ORDER BY
clause à ma requête. Dans l'idéal, j'aimerais être capable de faire quelque chose comme paramètres nommés, d'où ma requête devrait ressembler à:
SELECT DISTINCT o FROM MyObject o ORDER BY :order
Que je ne puis préciser le domaine (a, b, c) que je veux. Est-il possible de le faire à l'aide de Couture/Hibernate/JPA? Est-il une meilleure stratégie pour lutter contre cela?
OriginalL'auteur Shadowman | 2010-11-23
Vous devez vous connecter pour publier un commentaire.
Requêtes nommées ne peuvent pas être modifiés au moment de l'exécution.
//----- Édition-partie
Son JPA spécifiques.
Je ne pense pas que cette solution fonctionne. Selon le JPQL Langue de référence les paramètres d'entrée ne sont autorisés que dans
WHERE
etHAVING
clauses. Avez-vous essayé cette requête?Édité ma réponse en conséquence.
Oui, il donne de meilleures performances. Les requêtes nommées sont validées au cours du déploiement de temps & définition de la requête est analysée qu'une seule fois et ré-utilisé par la suite. Le déploiement peut échouer si la requête est syntaxiquement incorrect. Ils sont limités à l'unité de persistance.
Sur un côté-remarque: si vous utilisez cette solution dans un site web, il sera facile de pirater l'aide d'une simple injection SQL. Il n'y a pas d'autre solution pour dynamique requêtes Hibernate autant que je sache si c'est la bonne solution, mais d'ajouter une méthode pour vérifier si c'est un argument valide, et de rejeter les chaînes contenant un 'select' ou autres suspects SQL...
OriginalL'auteur Nayan Wadekar
Voir ma solution dans hibernate-nommé-requête-ordonnance-en-partameter
Idée de base est de stocker la requête sans la clause order by et le modifier au moment de l'exécution.
OriginalL'auteur SaSConsul