Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir tous les enfants et sous-enfants du parent JPA

Vous pouvez gérer cela dans le modèle de domaine en rendant la relation bidirectionnelle et en écrivant une méthode récursive pour parcourir l'arborescence. L'un des avantages de ceci est qu'il s'occupera des enfants à n'importe quel niveau.

Cela ressemblerait à quelque chose comme ci-dessous, puis pour toute instance que vous pouvez faire :

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

Entité :

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