我有一个类似于以下示例的实体:
@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查询?
谢谢!
答案 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()