Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen aller untergeordneten und untergeordneten Elemente von der übergeordneten JPA

Sie können dies im Domänenmodell handhaben, indem Sie die Beziehung bidirektional machen und eine rekursive Methode schreiben, um den Baum zu durchlaufen. Ein Vorteil davon ist, dass es mit Kindern auf jedem Niveau umgehen kann.

Dies würde etwa wie folgt aussehen und dann können Sie für jede Instanz Folgendes tun:

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

Entität:

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