복붙노트

[SPRING] 최대 절전 모드 : 자기 조인 혼란?

SPRING

최대 절전 모드 : 자기 조인 혼란?

나는 SQL 쿼리를 찾았으므로 처음 5 개 범주의 하위 범주를 가져와야합니다.

SELECT m.category_id,m.category_name  AS 'Parent',
      e.category_name AS 'Sub'
FROM category e
INNER JOIN category m ON m.category_id = e.parent_category_id
ORDER BY Parent

쿼리가 동일한 테이블 자체에 참여하고 있습니다. 아래 결과가 표시됩니다.

import java.io.Serializable;
import java.util.Set;
import javax.persistence.*;

@Entity
@Table(name = "category")
public class FetchSubCategory implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "category_id")
    private Integer categoryId;

    @Column(name = "category_name")
    private String categoryName;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "parent_category_id")
    private FetchSubCategory parent;

    @OneToMany(mappedBy = "parent")
    private Set<FetchSubCategory> subCategory;

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public FetchSubCategory getParent() {
        return parent;
    }

    public void setParent(FetchSubCategory parent) {
        this.parent = parent;
    }

    public Set<FetchSubCategory> getSubCategory() {
        return subCategory;
    }

    public void setSubCategory(Set<FetchSubCategory> subCategory) {
        this.subCategory = subCategory;
    }

}
public Set<FetchSubCategory> fetchSubCategory() throws SQLException, ClassNotFoundException, IOException {
        Set<FetchSubCategory> groupList = null;
        try {
            Session session = sessionFactory.getCurrentSession();
            Query query = session.createQuery("SELECT m.categoryName AS 'Parent', e.categoryName AS 'Sub' FROM FetchSubCategory e INNER JOIN FetchSubCategory m ORDER BY Parent");

            groupList = (Set<FetchSubCategory>) query.list();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return groupList;
    }

아무도 내 실수를 바로 잡고 위의 이미지와 같은 결과를 가져 오는 방법을 말해 줄 수 있습니까?

해결법

  1. ==============================

    1.

    @Entity
    @Table(name = "category")
    public class FetchSubCategory implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "category_id")
        private Integer categoryId;
    
        @Column(name = "category_name")
        private String categoryName;
    
        @NotFound(action = NotFoundAction.IGNORE)
        @ManyToOne
        @JsonIgnore
        @JoinColumn(name = "parent_category_id")
        private FetchSubCategory mainCategory;
    
        @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)//Avoiding empty json arrays.objects
        @OneToMany(mappedBy = "mainCategory", fetch = FetchType.EAGER)
        private List<FetchSubCategory> subCategory;
    
        public Integer getCategoryId() {
            return categoryId;
        }
    
        public void setCategoryId(Integer categoryId) {
            this.categoryId = categoryId;
        }
    
        public String getCategoryName() {
            return categoryName;
        }
    
        public void setCategoryName(String categoryName) {
            this.categoryName = categoryName;
        }
    
        public FetchSubCategory getMainCategory() {
            return mainCategory;
        }
    
        public void setMainCategory(FetchSubCategory mainCategory) {
            this.mainCategory = mainCategory;
        }
    
        public List<FetchSubCategory> getSubCategory() {
            return subCategory;
        }
    
        public void setSubCategory(List<FetchSubCategory> subCategory) {
            this.subCategory = subCategory;
        }
    
    public List<FetchSubCategory> fetchSubCategory() throws SQLException, ClassNotFoundException, IOException {
            List<FetchSubCategory> groupList = null;
            try {
                Session session = sessionFactory.getCurrentSession();
                Query query = session.createQuery("select distinct e FROM FetchSubCategory e INNER JOIN e.subCategory m ORDER BY m.mainCategory");
                groupList = query.list();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return groupList;
        }
    
  2. ==============================

    2.자신의 경우와 마찬가지로 자기 조인을 위해서는 아래의 내용이 도움이 될 것입니다.

    자신의 경우와 마찬가지로 자기 조인을 위해서는 아래의 내용이 도움이 될 것입니다.

        @ManyToOne(cascade={CascadeType.ALL})    
        @JoinColumn(name = "parent_category_id")
        private FetchSubCategory parent;
    
        @OneToMany(mappedBy = "parent")
        private Set<FetchSubCategory> subCategory;
    

    FetchSubCategory 엔티티 클래스에서 FetchSubCategory parent와 Set subCategory의 두 속성을 정의했습니다. 속성 부모는 @ManyToOne 주석으로 매핑되고 부하는 @OneToMany로 매핑됩니다. 또한 @OneToMany 속성 내에서 우리는 mappedBy = "parent"를 정의하여 parent를 관계 소유자로 만들고 테이블 내의 외부 관계를 관리합니다.

    또한 @JoinColumn이라는 주석은 부모에게 정의되어 관계 소유자가됩니다. @JoinColumn은 우리의 경우 parent_category_id 인 조인 열을 정의합니다.

  3. from https://stackoverflow.com/questions/31668522/hibernate-self-join-confusion by cc-by-sa and MIT license