代码之家  ›  专栏  ›  技术社区  ›  PatrickT80

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

  •  0
  • PatrickT80  · 技术社区  · 7 年前

    我正在搜索一种方法,使用带有元模型的jpa条件查询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}
    

    }

    表family\u成员

    @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;}
    }
    

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

    为了通过普通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\u memebers的行数。

    1 回复  |  直到 7 年前
        1
  •  0
  •   crizzis    7 年前

    重新表述您的问题:您需要的是族实体的列表,以及 Family.familyMembers 急切地被抓住,对吗?在这种情况下,您需要 fromFamily.fetch(...) 而不是 fromFamily.join(...) .