Hibernate标准 - 获取关联实体的列表,而不是父实体

时间:2014-04-13 06:37:19

标签: java hibernate criteria

我有两个具有单向@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限制?

2 个答案:

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