2014-12-31 32 views
8

我有一個實體,稱爲Band與屬性List<Genres> genres,流派與下列值的ENUM:ALTERNATIVE_ROCK("Alternative Rock"), CLASSIC_ROCK("Classic Rock"), HARD_ROCK("Hard Rock"), HEAVY_METAL("Heavy Metal"),PROGRESSIVE_ROCK("Progressive Rock");使用枚舉列表在HQL查詢參數

我試圖創建一個使用返回List<Band>的方法List<Genres>作爲參數使用HQL,像:

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

但我收到與HQL查詢了一些錯誤,我會嘗試?

以上,我已經嘗試了一些HQL查詢...

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

返回一個錯誤,指出一個ArrayList不能被強制轉換爲枚舉...

或...

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

返回類似以下錯誤:解引用標量集合元素ENUM

屬性類型映射g,實體樂隊...

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

你試過的那些查詢是什麼,以及相應的錯誤是什麼? –

+0

請添加'List '的註釋,重要的是看它是否是'EnumType.String'或默認值。 –

+0

我使用這個ENUM就像ENUMTYPE.STRING –

回答

6

這適用於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())); 

檢查方法Query#setParameterList是用來代替Query#setParameter,也是它的使用g insted的的g.value

+0

謝謝! !它工作完美!新年快樂,並繼續與Java uahauhauhauhauah搖擺! –

1

我不認爲你可以做到這一點。根據JPA spec (section 4.6.9. page 185)列表不支持作爲具有IN表達式的左側操作數。

+0

像@AVolpe所說的整個屬性......它使用setParameterList方法與Hibernate 4一起使用 –