java - 从父级 JPA 获取所有子级和子级
问题描述
我有一个表 TABLE 可以有相同类型的父母。在 Java 中,孩子可以到达父母,但父母没有孩子的列表。
在 MySQL 中,我能够创建以下查询,为我提供父级的子级和子级,但我无法将其转换为 JPA Java。
我如何翻译这个查询:
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;
}
解决方案
您可以在域模型中处理此问题,方法是使关系双向并编写递归方法来遍历树。这样做的一个优点是它可以处理任何级别的孩子。
这看起来像下面这样,然后在任何情况下您都可以这样做:
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;
}
}
推荐阅读
- microsoft-graph-api - Microsoft Graph API - 无法列出会议室地点:需要 place.read.all 权限
- javascript - 提取具有多个值的对象并使用 Javascript 传递它们
- fiware - Cygnus 不保留数据,因为:“生成的命名空间名称太长 >127”
- python - 如何将填充有元组的一维 h5py 类数组对象转换为二维 Dask 数组?
- javascript - 我正在尝试在保存的搜索中进行内联编辑时使用suitescript验证一个日期在另外两个日期之间
- c# - 如何在gridview的行中更改文本框中的值?
- reactjs - reactjs 放弃当前组件渲染
- windows - 在 Windows 命令行输出前附加文本
- c# - 如何在 c# 中使用递归来构建模型并将值分配给属性?
- java - 甚至不需要时需要通用参数?