我有三个实体ClassA,ClassB和ClassC。
ClassA {
...
@Id
@GeneratedValue
@Column(name = "a_id")
private long id;
...
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="a_id")
private List<ClassB> bbb;
...
}
ClassB {
...
@ManyToOne
private ClassC ccc;
...
}
ClassC {
...
private String name;
...
}
我希望通过ClassC的'name'成员按类别的休眠标准ClassA进行过滤。所以我想通过具有指定名称的ClassC对象内部的ClassA对象的hibernate条件列表来获取。问题是对ClassC对象的访问是通过ClassB列表。
我尝试了类似的东西,但它不起作用:
crit.createCriteria("bbb").createCriteria("ccc").add(Restrictions.ilike("name", name, MatchMode.ANYWHERE));
我将不胜感激。
答案 0 :(得分:2)
您需要使用别名来嵌套限制:
criteria.createAlias("bbb", "bbb", CriteriaSpecification.LEFT_JOIN);
criteria.createAlias("bbb_ccc", "bbb.ccc", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));
这将过滤实体aaa上的结果,但实际上不会获取关联的实体(bbb和ccc)。要获取这些实体,最简单的方法是将映射注释参数设置为FetchMode.EAGER。但您也可以在每个查询的基础上动态地在代码中执行此操作。
答案 1 :(得分:1)
由于现在不推荐使用CriteriaSpecification.LEFT_JOIN,因此您可以使用org.hibernate.sql.JoinType.LEFT_OUTER_JOIN
criteria.createAlias("bbb", "bbb", JoinType.LEFT_OUTER_JOIN);
criteria.createAlias("bbb_ccc", "bbb.ccc", JoinType.LEFT_OUTER_JOIN);
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));