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

y a-t-il un moyen de spécifier des paramètres optionnels (par exemple 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 aux requêtes nommées HQL ainsi.

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

23
demandé sur naXa 2010-03-15 04:41:36

4 réponses

AFAIK, il n'y a pas de telle chose donc vous devrez écrire une requête dynamique pour cela. Peut-être jeter un oeil à cette réponse précédente montrant comment faire cela en HQL (que vous pouvez transposer en SQL) et montrant aussi comment L'API critères le rend plus simple et est donc mieux adapté pour ce travail à mon avis.

mise à jour: (répondant à un commentaire de L'OP) travailler avec une base de données héritée peut être en effet délicat avec hibernation. Peut-être Pouvez-vous utiliser une requête native dynamique et retourner Non-managed entities cependant. Mais à long terme, les choses pourraient empirer (Je ne peux pas le dire pour vous). Peut-être que L'hibernation n'est pas le meilleur choix dans votre cas et quelque chose comme iBATIS vous donnerait la flexibilité dont vous avez besoin.

12
répondu Pascal Thivent 2017-05-23 12:26:31

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

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

Si :valeur est passée en tant que null, tous les produits sont retournés.

Voir aussi paramètres optionnels ou nuls

notez que cela ne fonctionnera pas dans certaines versions de Sybase en raison de ce bug , ainsi, le suivant est une alternative:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
35
répondu Ian Jones 2017-05-23 11:47:27

malheureusement la solution sous" Paramètres optionnels ou nuls " ne fonctionne pas dans les listes. J'ai dû changé la requête comme suit ...

Nommé définition de la requête:

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.

6
répondu Kosima 2012-04-23 11:30:58

une autre solution pour gérer les paramètres de liste optionnels est de vérifier s'ils sont nuls en utilisant la fonction COALESCE . COALESCE est supporté par Hibernate renvoie le premier paramètre non nul d'une liste, vous permettant de vérifier nul sur une liste sans casser la syntaxe quand il y a plusieurs éléments dans la liste.

exemple HQL avec paramètre optionnel 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.

2
répondu Jon Williams 2014-07-16 20:04:39