2014-12-31 13 views
8

Ich habe ein Unternehmen namens Band mit einem Attribute List<Genres> genres, Genre ist eine ENUM mit den folgenden Werten: ALTERNATIVE_ROCK("Alternative Rock"), CLASSIC_ROCK("Classic Rock"), HARD_ROCK("Hard Rock"), HEAVY_METAL("Heavy Metal"),PROGRESSIVE_ROCK("Progressive Rock");mit Aufzählungsliste als Parameter in HQL Abfrage

Ich versuche, ein Verfahren zu schaffen, die ein List<Band> einer Verwendung zurückzugibt List<Genres> als Parameter mit HQL, so etwas wie:

public List<Band> listBandsPerGenres(List<Genres> genres); 

Aber ich habe einige Fehler mit HQL-Abfragen empfangen, die ich versucht hatte?

Vor einigen HQL-Abfragen, die ich versucht habe ...

Query q = getSession().createQuery("SELECT b FROM Band b JOIN FETCH b.genres g WHERE g IN (?)"); 
     q.setParameter(0, genres); 
     return q.list(); 

einen Fehler zurückgibt sagen, dass eine Arraylist nicht Enum ...

oder

... gegossen werden kann
"SELECT b FROM Band b JOIN FETCH b.genres g WHERE g.value IN (?)" 

gibt einen Fehler zurück wie: Dereferenz Skalar Sammelelement ENUM

Eigenschaftsgenres mappin g, Einheitsband ...

@Basic(optional=false) 
    @Enumerated(EnumType.STRING) 
    @ElementCollection(targetClass=Genres.class) 
    @CollectionTable(name="banda_generos", join[email protected](name="id_banda", nullable=false)) 
    private List<Genres> genres; 
+2

Was waren diese Abfragen, die Sie ausprobiert haben, und welche Fehler gab es? –

+0

Bitte fügen Sie die Anmerkungen der 'Liste ' hinzu, es ist wichtig zu sehen, ob es 'EnumType.String' oder der Standard ist. –

+0

Ich benutze diese ENUM wie ENUMTYPE.STRING –

Antwort

6

Dies funktioniert für Hibernate 4

Query q = s 
      .createQuery("SELECT b FROM Q27715453$Band b JOIN b.genres g WHERE g IN (:genres)"); 
    q.setParameterList("genres", Arrays.asList(Genres.ROCK, Genres.CLASSIC)); 
    System.out.println(Arrays.toString(q.list().toArray())); 

Überprüfen Sie, ob das Verfahren Query#setParameterList statt Query#setParameter verwendet wird, wird es auch verwendet g von g.value insted.

+0

Danke! !! es hat perfekt funktioniert !!! Frohes neues Jahr und weiter mit Java rouahauhauhauah !! –

1

Ich glaube nicht, dass Sie das tun können. Gemäß JPA spec (section 4.6.9. page 185) werden Listen nicht als linker Operand mit IN Ausdruck unterstützt.

+0

wie @AVolpe sagte in der Antwort unten ... es funktioniert mit Hibernate 4 mit setParameterList Methode –

Verwandte Themen