2016-06-15 9 views
4

Ich habe eine "Role" -Tabelle mit einer "Name" -Spalte. Ich muss alle Rollen bekommen, wo Namen entweder "Rolle1" oder "Rolle2" sind. Die Rollenrepositorymethode sieht wie folgt aus:Spring Data IN-Klausel fügt zusätzliche Klammern hinzu

Set<Role> findByNameIsIn(Set<String> roleNames); 

Meine Datenbank enthält nur 'role1'. Die Anforderung, die erzeugt wird, sieht so aus:

SELECT ID, NAME FROM ROLE WHERE (NAME IN ((?,?))) 
    bind => [role1, role2] 

Bitte beachten Sie die doppelten Klammern um die Parameter. Ergebnismenge ist leer. Wenn ich diese Abfrage manuell über die h2 Konsole durchführe - auch keine Ergebnisse. Die folgende Abfrage funktioniert:

SELECT ID, NAME FROM ROLE WHERE (NAME IN ('role1', 'role2')) 

Mein Satz enthält genau zwei Elemente. Sets sollten als Parametertyp unterstützt werden. Siehe: https://dzone.com/refcardz/core-spring-data

Und schließlich die Frage: Was vermisse ich?

+1

Welche Anbieter und Datenbankpersistenz verwenden Sie? Es gab ein paar Bugs für verschiedene in diesem Bereich. –

+0

EclipseLink + H2 eingebettete Datenbank – Yuriy

+1

Gebrochen seit 2011 ... https://bugs.eclipse.org/bugs/show_bug.cgi?id=349477 –

Antwort

6

Wie Oliver Gierke erwähnt - es ist ein Fehler für dieses Problem in EclipseLink (das ist, was ich als Persistenz-Anbieter verwende) Problem Tracker geöffnet. ! Seit 2011 .. Hier ist die Lösung:

@Query("select r from Role r where r.name in ?1") 
Set<Role> findByNameIsIn(Set<String> roleNames); 

Und hier ist die gültige generierte Abfrage:

SELECT ID, NAME FROM ROLE WHERE (NAME IN (?,?)) 
    bind => [role1, role2] 
+0

Danke, Sie haben meinen Tag gemacht. – psychowood

Verwandte Themen