【问题标题】:using enum list as parameter in HQL query在 HQL 查询中使用枚举列表作为参数
【发布时间】:2015-02-27 05:00:18
【问题描述】:

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

我正在尝试创建一个方法,该方法使用 List<Genres> 作为 HQL 的参数返回 List<Band>,类似于:

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

属性类型映射,实体乐队...

    @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;

【问题讨论】:

  • 您尝试了哪些查询,相应的错误是什么?
  • 请添加List&lt;Genres&gt;的注解,重要的是看是EnumType.String还是默认的。
  • 我正在使用这个 ENUM,比如 ENUMTYPE.STRING
  • 请添加带有所有注释的整个属性(流派属性)

标签: java hibernate enums persistence hql


【解决方案1】:

我认为你做不到。根据JPA spec (section 4.6.9. page 185),不支持列表作为带有IN 表达式的左侧操作数。

【讨论】:

  • 就像@AVolpe 在下面的答案中所说...它与 Hibernate 4 一起使用 setParameterList 方法
【解决方案2】:

这适用于 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 of g.value

【讨论】:

  • 谢谢!!!它工作得很好!新年快乐,继续与 Java uahauhauhauhauah 一起摇摆!!
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2015-11-22
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多