hibernate标准OneToMany,ManyToOne和List

时间:2010-01-19 21:27:47

标签: hibernate criteria

我有三个实体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));

我将不胜感激。

2 个答案:

答案 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));