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.
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.
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
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.
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.
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