使用枚举列表作为HQL查询中的参数

时间:2014-12-31 02:35:47

标签: java hibernate enums persistence hql

我有一个名为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;

2 个答案:

答案 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表达式的左侧操作数。