我有一个名为Band
的实体,其属性为List<Genres> 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>
的方法,如:
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 (?)"
返回如下错误:dereference标量集合元素ENUM
属性类型映射,实体Band ...
@Basic(optional=false)
@Enumerated(EnumType.STRING)
@ElementCollection(targetClass=Genres.class)
@CollectionTable(name="banda_generos", joinColumns=@JoinColumn(name="id_banda", nullable=false))
private List<Genres> genres;
答案 0 :(得分:8)
这适用于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
g.value
{}进行了{{1}}。
答案 1 :(得分:1)
我认为你不能这样做。根据{{3}}列表不支持带有IN
表达式的左侧操作数。