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

在JPA中选择父类和所有子类的计数

卫飞鹏
2023-03-14

我有以下JPA实体结构。

@Entity
@Table(name = "PARENT_DETAILS")
class Parent{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parent_details_seq")
    @SequenceGenerator(name = "parent_details_seq", sequenceName = "PARENT_DETAILS_SEQ", allocationSize = 1)
    @Column(name = "PARENT_ID")
    private long parentId;

    @Column(name = "PARENT_NAME")
    private String parentName;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "childPK.parent", cascade = CascadeType.ALL)
    private Set<Child> child;
    //setters and getters
}

@Entity
@Table(name = "CHILD_DETAILS")
public class Child {

    private ChildPK childPK;

    public void setProgramProcessesPK(ChildPK childPK) {
        this.childPK = childPK;
    }

    @EmbeddedId
    public ChildPK getChildPK() {
        return childPK;
    }

  }


@Embeddable
public class ChildPK implements Serializable {
    private static final long serialVersionUID = 1L;
    private Parent parent;

    private long childId;

    @Column(name = "CHILDID")
    public long getChildId() {
        return childId;
    }

    public void setChildId(long childId) {
        this.childId = childId;
    }

    @ManyToOne
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", nullable = false)
    public ParentDetails getParent() {
        return parent;
    }
}

我想写一个JPA查询,它将返回给定parent_id的PARENT_NAME和所有子级的计数。

t我能想到的唯一解决办法是加入并编写一个复杂的条件查询。

我想不出使用简单的JPA查询获得结果的方法。

有更简单的方法吗?

共有2个答案

吕自明
2023-03-14

您可以使用以下JPA命名查询:

private static class ParentChildsNumber {
    public String parentName;
    public Integer childsNum;

    public ParentChildsNumber(String parentName, Integer childsNum) {
        this.parentName = parentName;
        this.childsNum = childsNum;
    }
}

@NamedQuery(name="getParentChildsNumberQuery", query="SELECT NEW ParentChildsNumber(p.parentName, SIZE(p.child)) FROM Parent p WHERE p.parentId = :parentId GROUP BY p.parentId, p.parentName")

通过以下方式在您的代码中使用它:

@PersistenceContext(unitName="YourPersistentUnit")
private EntityManager em;

em.createNamedQuery("getParentChildsNumberQuery", ParentChildsNumber.class).setParameter("parentId", parentId).getSingleResult();
卜盛
2023-03-14

你试过大小吗?像“从父父级中选择parent.parent名称、大小(parent.child)”这样的方法可能会奏效。

 类似资料:
  • 我正在尝试建立自己的Webshop。 我有两个表-products和categories。结构是这样的: 当用户点击main category时,我选择要显示的产品如下所示: 问题是,我希望当用户单击主类别时,也可以选择其子类别中的所有产品。例如,类别是类别的子类别,在db中类似于 如您所见,我的当前选择将不会选择或,因为用户正在查看具有的类别...如何修改我的选择,使它将显示所有产品从主类别的子

  • 问题内容: 假设我有两个表,“父母”和“孩子”。父子关系是一个多对多关系,可通过标准的交叉引用表来实现。 我想查找使用SQL(特别是MS SQL Server的T-SQL; 2005语法可以接受)的给定子集的所有成员所引用的所有Parent记录。 例如,假设我有: List item Parent Alice Parent Bob Child Charlie references Alice, B

  • 问题内容: 当我在Eclipse中编辑Java类时,当光标悬停在类变量上时,我可以使用+ 弹出框来显示其所有父级和子类。IntelliJ中的等效项是什么? 例: 管道是我的光标。 问题答案: 导航| 但是,在“面板”中,“ 类型 +” 将显示类似的信息。您可以 浮动 和 取消 固定面板,以使其仅在使用键盘快捷键时才出现在固定的显示位置。

  • 三个表保存文章信息: 类别表: lft:左值 rgt:正确的值 lft和rgt值为嵌套集,例如: 文章表: 物品类别地图表: 如何在MySQL中从一个类别和子类别中选择所有文章? 我期望: 1、 单击cat2时,显示cat2和cat5以及cat6和cat7的所有项目。 2、 单击cat5时,仅显示cat5的所有项目。 3、点击root时,显示所有类别的所有文章(包括cat1、cat2、cat3、c

  • 我有两个从抽象类继承的类,它们有父子关系。 所以我使用了注释OneToOne和ManyToOne,但是子类中的父实体总是为空。有人能帮我吗,我花了几个小时谷歌和测试了许多conf,但没有成功。 这些是我的类中的代码: ... ... ... 如果我不添加@JoinCol列注释,JPA会创建一个关联表,但无法检索父级,而关联可以直接通过在数据库中请求来完成。 非常感谢你的帮助。 祝好

  • 问题内容: 我有下表: 我想让Folder类具有父子关系。 问题答案: 我相信正确的映射将是: 该会的工作只有当每个家长有最多一个孩子,上面的代码适用于更一般的情况下,父母可以有许多儿童。另外,为简单起见,我省略了get / set方法。