web-dev-qa-db-fra.com

Paramètres facultatifs avec requête nommée dans Hibernate?

Existe-t-il un moyen de spécifier des paramètres facultatifs (tels que lorsque les paramètres de recherche sont fournis à partir d'un formulaire et que tous les paramètres ne sont pas requis) dans une requête nommée lors de l'utilisation de Hibernate ? J'utilise une requête native SQL , mais la question est probablement applicable au nom HQL requêtes également.

Je suis sûr que la réponse à cette question est "non", mais je n'ai pas encore trouvé la réponse définitive dans la documentation.

30
Ickster

AFAIK, il n'y a rien de tel, vous devrez donc écrire une requête dynamique pour cela. Peut-être jetez un œil à cela réponse précédente montrant comment faire cela dans HQL (que vous pouvez transposer en SQL) et montrant également comment l'API Criteria le rend plus simple et est donc mieux adapté à ce travail dans mon opinion.

Mise à jour: (réponse à un commentaire de l'OP) Travailler avec une base de données héritée peut en effet être délicat avec Hibernate. Vous pouvez peut-être utiliser une requête native dynamique et renvoyer entités non gérées cependant. Mais à long terme, les choses pourraient empirer (je ne peux pas le dire pour vous). Hibernate n'est peut-être pas le meilleur choix dans votre cas et quelque chose comme iBATIS vous donnerait la flexibilité dont vous avez besoin.

14
Pascal Thivent

Comme mentionné dans un réponse différente à question référencé précédemment, la construction HQL suivante fonctionne pour moi:

select o from Product o WHERE :value is null or o.category = :value

si :value est transmis sous la forme null, tous les produits sont renvoyés.

Voir aussi Paramètres facultatifs ou nuls

Notez que cela ne fonctionnera pas dans certaines versions de Sybase en raison de ce bogue , donc ce qui suit est une alternative:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
38
Ian Jones

malheureusement, la solution sous "Paramètres facultatifs ou nuls" ne fonctionne pas pour les listes IN. J'ai dû changer la requête comme suit ...

Définition de requête nommée:

select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))

Code:

Set<KiHandlingTypeEnum> inHandlingTypes = ...

Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);

List<KiLogicalStock> stocks = query.getResultList();

Beaucoup de plaisir à travailler.

7
Kosima

Une autre solution pour gérer les paramètres de liste facultatifs consiste à vérifier la valeur null à l'aide de la fonction COALESCE . COALESCE est pris en charge par Hibernate renvoie le premier paramètre non nul d'une liste, vous permettant de vérifier la valeur null sur une liste sans casser la syntaxe lorsqu'il y a plusieurs éléments dans la liste.

Exemple HQL avec paramètre facultatif et paramètre de liste:

select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
  and ( :parameter is null or obj.field2 = :parameter )

Cela a fonctionné pour moi avec un dialecte SQL Server.

3
Jon Williams

Pour ceux qui ont des problèmes avec les valeurs NULL, une autre option consiste à utiliser une autre valeur. Dans mon cas, j'ai utilisé uniquement des valeurs positives pour mon champ de catégorie, ce qui me permet d'utiliser comme valeur alternative = -1.

Par conséquent, avant d'exécuter la requête, vous pouvez effectuer une petite validation:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
0
georgeos