J'ai construit un NamedQuery qui ressemble à ceci:
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN (:inclList)")
Ce que je veux faire, c'est remplir le paramètre: inclList avec une liste d'éléments au lieu d'un élément. Par exemple, si j'ai un new List<String>() { "a", "b", "c" }
comment puis-je obtenir cela dans le paramètre: inclList? Cela ne me permet de codifier qu'une seule chaîne. Par exemple:
setParameter("inclList", "a") // works
setParameter("inclList", "a, b") // does not work
setParameter("inclList", "'a', 'b'") // does not work
setParameter("inclList", list) // throws an exception
Je sais que je pourrais simplement créer une chaîne et construire toute la requête à partir de cela, mais je voulais éviter la surcharge. Existe-t-il une meilleure façon de le faire?
Question connexe: si la liste est très grande, existe-t-il un bon moyen de créer une requête comme celle-ci?
Réponses:
Lors de l'utilisation
IN
avec un paramètre à valeur de collection, vous n'avez pas besoin(...)
:la source
Le format de requête JPA approprié serait:
Si vous utilisez une ancienne version d'Hibernate comme fournisseur, vous devez écrire:
mais c'est un bug ( HHH-5126 ) (EDIT: qui a été résolu maintenant).
la source
Fonctionne pour moi avec JPA 2, Jboss 7.0.2
la source
Vous devez convertir
List
comme indiqué ci-dessous:la source