Hibernate:搜索包含一组枚举值的实体

时间:2014-08-26 19:58:10

标签: java hibernate enums set criteria

我有一个类似于以下示例的实体:

@Entity
@Table(name = "AIRPLANE")
public class Airplane {

    @ElementCollection(targetClass = Color.class, fetch = FetchType.LAZY)
    @CollectionTable(name = "AIRPLANE_COLORS", joinColumns = @JoinColumn(name = "AIRPLANE_ID"))
    @Column(name = "AIRPLANE_COLOR")
    @ForeignKey(name = "FK_AIRPLANE_COLOR_ID")
    @Enumerated(EnumType.STRING)
    private Set<Color> colors;    
    ...
}
...
public enum Color {
    WHITE, RED, BLUE
}

其中颜色是一组枚举,我想搜索包含此集合中RED颜色的所有实体Airplanes。

我可以使用Criterias制作,还是应该使用HQL查询?

谢谢!

3 个答案:

答案 0 :(得分:0)

条件API对于基于动态的...条件集创建查询非常有用。对于静态查询,HQL总是更具可读性:

select a from Airplane a where :color member of a.colors

select a from Airplane a join a.colors color where color = :color

应该做的伎俩

答案 1 :(得分:0)

根据JB Nizet的建议,您可以使用HQL来获得结果:

        Query query = session.createQuery("from Airplane as airplane inner join "
                + "airplane.colors colors where colors =:color");
        query.setParameter("color", Color.BLUE);

        List<Airplane> list = query.list();
        for (Airplane airplane : list) {
            System.out.println("->" + airplane.getColors());
        }

答案 2 :(得分:0)

有一种方法可以使用Hibernate中的Criteria来执行此类查询。您只需加入colors并询问其elements属性(即colors.elements)。

elements是在Hibernate的CollectionPropertyNames课程中定义的关键字,您可以使用它来访问您的枚举值。

session.createCriteria(Airplane.class)
    .createAlias("colors", "colors")
    .add(Restrictions.eq("colors.elements", Color.BLUE))
    .list()