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

从家长JPA处获取所有孩子和子孩子

曾修真
2023-03-14

我有一张桌子,可以有相同类型的父母。在Java中,子对象可以到达父对象,但父对象没有子对象列表。

在MySQL中,我能够创建以下查询,给我父级的子级和子级,但我无法将其转换为JPAJava。

如何翻译此查询:

SELECT * 
FROM TABLE AS T1 
INNER JOIN 
  (SELECT id FROM TABLE WHERE TABLE.parentId = 966) AS T2 
  ON T2.id = T1.parentId OR T1.parentId = 966 
GROUP BY T1.id

在java语言中,使用Criteria builder和Criteria Query,我已经尝试了以下方法:

CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<TABLE> cq = cb.createQuery(TABLE.class);
    Root<TABLE> tABLE= cq.from(TABLE.class);

    Predicate result = cb.conjunction();

    Join<TABLE, TABLE> TABLEJoin = tABLE.join("parent", JoinType.INNER);
    result = cb.and(result, cb.equal(genericLocationJoin.get("parent"), location));
em.createQuery(cq.select(tAble).where(result)).getResultList();

但这只给了我直接的孩子,没有给我亚孩子。

谢谢你的帮助。

实体:

@Entity
@Table(name = "table")
public final class TABLE {

    @Column(nullable = false, unique = true, length = 20)
    private String externalId;

    @Column(nullable = false, length = 50)
    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parentId", nullable = true)
    private TABLE parent;
}

共有1个答案

姚善
2023-03-14

您可以在域模型中处理这个问题,方法是使关系具有双向性,并编写一个递归方法来遍历树。这样做的一个好处是,它可以处理任何级别的儿童。

这看起来像下面这样,然后在任何情况下,你都可以这样做:

SomeEntity e = //;
e.getChildren(); //only direct children
e.getAllChildren(); //all children

实体:

@Entity
@Table(name = "some_entity")
public final class SomeEntity {

    @Column(nullable = false, unique = true, length = 20)
    private String externalId;

    @Column(nullable = false, length = 50)
    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parentId", nullable = true)
    private SomeEntity parent;

    @OneToMany(mappedBy = "parent")
    private List<SomeEntity> children; //or Set<>

    //returns direct children
    public List<SomeEntity> getChildren(){
        return children;
    } 

    //returns all children to any level
    public List<SomeEntity> getAllChildren(){
        getAllChildren(this);
    }

    //recursive function to walk the tree
    private List<SomeEntity> getAllChildren(SomeEntity parent){
        List<SomeEntity> allChidren = new ArrayList<>();

        for(SomeEntity child : children){
            allChildren.add(child);
            allChildren.addAll(getAllChildren(child);
        }

        return allChildren;
    }
}
 类似资料:
  • 我在猜测下面的查询是如何通过JPQL编写的: 选择最后一个子项(最新id)具有特定列(属性)值的所有父项(1-n关系的第1侧)。我的实体看起来像 父母亲JAVA Child.java JPQL会是什么样子?谢谢大家

  • 这样不仅可以将转移页面的子元素放入数组,还可以将子元素的子元素放入数组。

  • 问题内容: 我在Web应用程序中通过Hibernate使用JPA。这是两个实体(仅显示吸气剂): 如您所见,并称为“一对多”。 现在,我需要加载一个实例,删除部分或全部子代并保存更改。以下是对我不起作用的代码: 在上面的示例中未删除子实体。现在,我必须手动为每个孩子打电话。 有没有更简单的方法来管理子代? 请注意,我不想使用特定于Hibernate的功能,只能使用纯JPA。 问题答案: 对于JPA

  • 问题内容: 最初,我一直在尝试获取父母的名单以及每个父母的一个最近的孩子。我已经知道如何使用以下查询 但是问题是,结果不包括没有孩子的父母。添加也无济于事。所以我想我可以对所有没有孩子的父母进行查询,然后将这两个查询合并为一个查询。但是我在建立这样的查询时遇到了麻烦。将不胜感激任何建议。 问题答案: 这是您的查询:

  • 问题内容: 我在父容器中有两个子元素,如下所示: 我尝试了以下CSS: 我怎样才能让两个孩子()都达到最高的孩子的身高? 问题答案: 一种解决方案是将后代元素的显示值从更改为:

  • 孩子王一面二面一起面的;一面全是八股文,答的还算不错。二面问的很多答不出来,问到了v-model原理和扫码登录前后端的实现(我说我有springboot基础)明天补二面面经。 一面面经: 1.自我介绍+项目介绍 2.css盒子模型(标准盒模型、怪异盒模型) 3.flex布局的属性、flex:1的意义 4.说说重绘与重排(区别+优化方案) 5.响应式布局的实现原理 6.ui设计稿为750px。真实窗