Question

Est-il possible de spécifier des paramètres optionnels (tels que lorsque les paramètres de recherche sont fournis à partir d'un formulaire et tous les paramètres sont nécessaires) dans une requête lors de l'utilisation du nom Mise en veille prolongée ? J'utilise un natif SQL la requête, mais la question est probablement applicable à nommé HQL requêtes aussi bien.

Je suis assez sûr que la réponse à cette question est « non », mais je ne l'ai pas trouvé la réponse définitive dans la documentation encore.

Était-ce utile?

La solution

AFAIK, il n'y a pas une telle chose que vous devrez écrire une requête dynamique pour cela. Peut-être un coup d'oeil à ce réponse précédente montrant comment faire cela dans HQL ( que vous pouvez transposer à SQL) et montrant également comment l'API Criteria rend plus simple et est donc mieux adapté pour ce travail à mon avis.

Mise à jour: (répondre à un commentaire de l'OP) Travailler avec une base de données existante peut être en effet difficile avec Hibernate. Peut-être vous pouvez utiliser une requête native dynamique et retour non entités -Gestion bien. Mais sur le long terme, les choses pourraient empirer (je ne peux pas dire que pour vous). Peut-être Hibernate est pas le meilleur choix dans votre cas et quelque chose comme iBATIS vous donnera la flexibilité dont vous avez besoin.

Autres conseils

Comme mentionné dans une réponse différente question fait référence précédemment, la construction suivante HQL fonctionne pour moi:

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

si :value est transmis comme null, tous les produits sont retournés.

Voir aussi en option ou Null Paramètres

Notez que cela ne fonctionne pas dans certaines versions de Sybase en raison de ce bug , de sorte que 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 nul » ne fonctionne pas pour les listes IN. Je devais changer la requête comme suit ...

Nommée 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.

Une autre solution pour la gestion des paramètres de liste en option est en vérifiant null en utilisant pris en charge par Hibernate retourne le premier paramètre non nul d'une liste, vous permettant de vérifier la valeur nULL sur une liste sans casser la syntaxe quand il y a plusieurs éléments dans la liste.

Exemple HQL avec le paramètre optionnel et paramètre 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 les questions ayant des valeurs NULL, une autre option est d'utiliser une autre valeur. Dans mon cas, je que des valeurs positives pour mon champ de catégorie, qui me permet d'utiliser mon autre valeur = -1.

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

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top