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

9
我有一个名为Band的实体,它具有属性List<Genres> genres,Genres是一个枚举类型,其包含以下值: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无法转换为Enum...

或者...

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

返回一个错误,例如:解引用标量集合元素ENUM

属性genres映射,实体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
你尝试了哪些查询,对应的错误是什么? - William Price
请添加 List<Genres> 的注释,看看它是 EnumType.String 还是默认值。 - Arturo Volpe
我正在使用这个枚举,就像 ENUMTYPE.STRING 一样。 - Bruno Santana
请添加带有所有注释的完整属性(genre属性)。 - Arturo Volpe
2个回答

9

这适用于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


谢谢!!!它完美地运行了!!!新年快乐,继续使用Java rock uahauhauhauhauah!! - Bruno Santana

1

就像下面答案中@AVolpe所说的那样...使用setParameterList方法可以与Hibernate 4一起使用。 - Bruno Santana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接