Je kunt dit in het domeinmodel aanpakken door de relatie bidirectioneel te maken en een recursieve methode te schrijven om door de boom te lopen. Een voordeel hiervan is dat het kinderen van elk niveau aankan.
Dit zou er ongeveer zo uitzien als hieronder en dan kun je voor elk geval het volgende doen:
SomeEntity e = //;
e.getChildren(); //only direct children
e.getAllChildren(); //all children
Entiteit:
@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;
}
}