我有两个具有单向@OneToMany映射的实体:
@Entity
@Table(name = "table1")
public class A {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
Integer pk;
String name;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "a_pk", nullable = false)
@Where(clause = "is_deleted = 0")
List<B> children;
}
@Entity
@Table(name = "table2")
public class B {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
Integer pk;
String content;
@Column(name = "is_deleted",nullable=false)
@NotNull
boolean deleted = false;
}
我想获得所有B实体的列表,这些实体是符合限制条件的实体的子代。
Criteria c = session.createCriteria(A.class)
.add(Restriction.like("name", "Test%"))
.createAlias("children","b");
???
这就是我被困住的地方:c.list()会返回一个A对象列表。我不关心A,我想要B.我怎么能用Hibernate标准/投影呢?如果重要的话,我使用Hibernate 4.2.12
在这个简化的案例中,热切地获取是有意义的;在实际情况中,有一个由四个OneToMany单向关联组成的链,我希望所有(或更好的,有些)孩子一直在树上知道root id;但是我不想加载所有的中间内容(它不需要,即使加入 - 获取四个表也能正常工作)。此外,简单地获取根并跟随惰性关联是N + 1问题升级的一个明显例子。
作为一个附带问题,Hibernate标准是否满足实体/属性@Where限制?
答案 0 :(得分:2)
您可以使用投影获取“b”列表。像这样:
Criteria c = session.createCriteria(A.class)
.add(Restriction.like("name", "Test%"))
.createAlias("children","b").setProjection(Projections.property("b"));
在此之后,当您尝试使用c.list()
获取结果时,它将返回 B 列表。
我希望这有帮助!!
答案 1 :(得分:0)
所以,是的,我最终使用了HQL。没什么特别的。
List<B> bList = session.createQuery(
"select b from A as a join a.children as b where a.name like 'Test%'"
).list();