当前位置: 首页 > 知识库问答 >
问题:

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

孔征
2023-03-14

我有两个实体与单向@OneTo多项映射:

@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;但是我不想加载所有的中间内容(这是不需要的,即使连接获取四个表也可以工作,这也太糟糕了)。此外,简单地获取根并跟踪惰性关联是n1问题升级的一个明显例子。

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

共有2个答案

郎仰岳
2023-03-14

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

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

您可以使用投影来获得"b"的列表。像这样:

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

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

 类似资料:
  • Javers v5.6.3 我有一个父实体,其中包含一系列子实体。当我区分两个父母列表,发现一个孩子有变化时,我需要知道哪个父母包含变化的孩子。 我的实体: 我想要区分的是: 为了简洁起见,切换到Groovy: 我是如何区分的: 输出: 我的问题是: 如何发现哪个父级包含子级/c1? 除了我有一个老板集合之外,这类似于应该检测薪酬变化()示例。使用该示例,给定具有不同下属的老板列表,如何找出的老板

  • 我有根实体及其单个关联。 当我获取实体时,我需要急切地获取,但只有的3个属性:userId、afstName、lastName。 现在我的标准查询是: 接下来,我执行,我得到了sql语句,它只选择了投影列表中指定的的3个属性。但它不选择根<code>Hostel</code>实体的任何属性。生成的查询为: 此查询不起作用,因为它返回五个空的。五个映射是因为有五个<code>Hostel</code

  • 我正在尝试使用一个不是很简单的关联表在两个JPA实体之间进行ManyTo许多连接。我想知道是否有一种方法可以在不创建关联表实体的情况下实现这一点(类似于使用@JoinTable)。 表A-ID(PK) -名称 表b -ID(PK) -名称 TableMapping-ID(PK) -Parent\u ID(FK)-- 映射以我上面描述的方式存储,原因我不知道,也无法更改。很多地方都在这样使用它,我必

  • 我一直在努力使用Hibernate标准实现搜索功能。要求有点模糊。用户可以在搜索字段中输入任何文本/单词,搜索必须通过多个相互之间没有任何关联的表进行。 下面是两个实体类。 如果用户输入“anycharecter”,则应在这两个表中搜索该表,并应返回与输入字符匹配的获取列表。我还想将表A的结果存储到列表中,将表B的结果存储到列表中。 我不确定使用hibernate标准如何实现这一点。 我只能为一张

  • 问题内容: 我有两个具有双向@OneToOne映射的类。 我需要编写代码来检索B的所有实例,这些实例没有与之关联的A实例。我还需要为所有没有B的A编写类似的查询。 我努力了: 但这似乎总是返回null。有什么想法吗? 问题答案: 这对两个方向都应该起作用:

  • 我将JPA2与Hibernate一起使用。有两个实体类,和。最后一个是第一个的继承实体。使用SINGLE_TABLE继承策略。当我尝试通过从id=“123456”的CardElement中查询