有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有两个具有单向@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实体的列表,它们是符合限制的a实体的子实体

Criteria c = session.createCriteria(A.class)
    .add(Restriction.like("name", "Test%"))
    .createAlias("children","b");
???

这就是我遇到的问题:c.list()将返回一个对象列表。我不在乎A,我想要B。我如何使用Hibernate标准/投影来实现它如果重要的话,我使用Hibernate 4.2.12

在这种简化的情况下,急切地去拿是有意义的;在真实的情况下,有四个一对一的单向关联链,我想让所有(或者更好的是,一些)孩子都知道根id;但我不想加载所有的中间内容(这不是必需的,而且即使join获取四个表也能工作,这也太糟糕了)。此外,简单地找到根并跟踪惰性关联是N+1问题升级的一个明显例子

作为一个附带问题,Hibernate标准是否满足实体/属性@Where限制


共 (2) 个答案

  1. # 1 楼答案

    你可以用投影得到“b”的列表。像这样:

    Criteria c = session.createCriteria(A.class)
        .add(Restriction.like("name", "Test%"))
        .createAlias("children","b").setProjection(Projections.property("b"));
    

    之后,当您尝试使用c.list()获取结果时,它将返回一个B列表。 我希望这有帮助

  2. # 2 楼答案

    所以,是的,我最终还是使用了HQL。没什么特别的

    List<B> bList = session.createQuery(
            "select b from A as a join a.children as b where a.name like 'Test%'"
            ).list();