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

如何使用元模型通过条件查询选择父实体引用的子实体

饶铭
2023-03-14

我正在寻找一种方法,使用带有元模型的jpa criteria查询API来选择父实体的所有子实体。

表族

@Entity
@Table(name = "FAMILIES")
public class Family {

 private Long familyId;
 private String familyName;
 private List<FamilyMember> familyMembers;

 @Id
 @Column(name="ID_FAMILY")
 @GeneratedValue(strategy = Generator.AUTO)
 public Long getFamilyId() { return familyId;}
 public void setFamilyId(Long fId) { familyId = fId;}

 @Column(name = "family_name")
 public String getFamilyName() { return familyName;}
 public void setFamilyName(String fN) { familyName = fN;}

 @OneToMany(mappedBy = "family")
 @JoinColumn(name = "id_family")
 public List<FamilyMember> getFamilyMembers() { return familyMembers;}
 public void setFamilyMembers(List<FamilyMember> fM) { familyMembers = fM}

}

表家庭成员

@Entity
@Table(name = "family_members")
public class FamilyMember {
 private Long familyMemberId;
 private Family family;
 private String name;
 private String role;

 @Id
 @Column(name="ID_FAMILY_MEMBER")
 @GeneratedValue(strategy = Generator.AUTO)
 public Long getFamilyMemberId() { return familyMemberId;}
 public void setFamilyMemberId(Long fMId) { familyMemberId = fMId;}

 @ManyToOne
 @JoinColumn(name = "id_family")
 public String getFamily() { return family;}
 public void setFamily(Family f) { family = f;}

 @Column(name = "name")
 public String getFamilyMemberName() { return name;}
 public void setFamilyMemberName(String fMN) { name = fMN;}

 @Column(name = "role")
 public String getFamilyMemberRole() { return role;}
 public void setFamilyMemberRole(String fMR) { role = fMR;}
}

现在,我想在选择family时选择family的所有子实体,而不是使用更慢的方法来获取所有family的列表,循环列表并填充family member list。

为了实现这个结果qith平原SQL,我写这样一个查询:

SELECT f.family_name, fM.name, fM.role FROM families AS f LEFT JOIN family_members AS fM ON fM.id_family = f.id_family;

现在我的问题是,如何将本机查询转换为criteria API查询。

实际上,在criteria API中,我尝试过:

// Init of EntityManager (eM)
CriteriaBuilder cB = eM.getCriteriaBuilder();
CriteriaQuery<Family> fCQ = cB.createQuery(Family.class);
Root<Family> fromFamily = fCQ.from(Family.class);
// My actual implementation
ListJoin<Family, FamilyMember> members = fromFamily.join(Family_.familyMembers);
TypedQuery<Family> fTQ = eM.createQuery(fCQ);

但是当我调用getResultList()时,我得到一个只包含家庭实体的列表,家庭表的行长度乘以family_memebers的行。

共有1个答案

薛墨一
2023-03-14

重新表述您的问题:您需要的是一个族实体列表,以及族。家庭成员急切地获取,对吗?在这种情况下,您需要来自家庭的。取回(…) 而不是来自家庭的。加入(…)

 类似资料:
  • 假设我有一个名为HQL(findRoomQuery)的文件: House实体的映射如下: 虽然Room实体是这样的: 这种关系是一个房子可以有一个或多个房间。 执行查询的代码如下: 您可以从选择r(r是h.room列表的别名)中看到HQL返回房间实体。 如何使用Hibernate条件查询做同样的事情?可能吗?

  • 我正在尝试解析下面的xml以根据某些条件获取ScId元素值。此条件在xpath字符串中提及,然后在xpath Next字符串中选择ScId值。 我使用VTD xml解析器使用嵌套的xpath查询来获取ScId值,该值以RC开头,类型=Daycare。 下面是代码 解析逻辑是 这是我的回报 解析值为SC101-91-new 虽然我期待它是 解析值为RC101-92-新

  • 我试图使用JPA标准编写以下查询,但我无法选择子查询中的多列。 我陷入了下面的实现过程中,无法找到如何在子查询中选择多个列。请看我在代码中的评论(第三行)。 请帮我解决这个问题。

  • 问题内容: 假设我有一个MySQL存储过程,其中包含以下选择: 如何在中使用注释,以便获得结果?就像是: 问题答案: 假设这是您的过程: 您定义一个: 然后您可以像这样调用过程: 您也可以使用EntityManager进行检查,如下所示:

  • 我通常使用JPQL查询数据库,但今天我不得不使用原生查询,因为性能原因和JPQL中没有的特性(联接子查询)。使用JPQL,可以使用join fetch来检索父实体及其子实体集合。然而,当我尝试使用本机查询时,对于每个父实体,将返回多行,每行包含父实体及其子实体之一的数据。然后返回的列表包含父级的重复对象。假设一个父级有两个子级,那么下面的查询将在列表中返回2个父级,而不是1个。 任何人都知道如何避

  • 我正在尝试为实体创建一个域模型(聚合),该实体包含子实体,并且可以有父实体。我们有实体包。我们可以把包裹分成更小的包裹(儿童)。每个分开的包都有一个父包。域的哪个部分应该包含域逻辑:聚合还是域服务?e、 g.聚合包有一个方法 分包还是原包?解决这个问题的正确方法是什么? 我希望我的域模型被ddd(应用程序和基础设施)的其他部分保持干净和幂等