[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.
@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.자신의 경우와 마찬가지로 자기 조인을 위해서는 아래의 내용이 도움이 될 것입니다.
자신의 경우와 마찬가지로 자기 조인을 위해서는 아래의 내용이 도움이 될 것입니다.
@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 인 조인 열을 정의합니다.
from https://stackoverflow.com/questions/31668522/hibernate-self-join-confusion by cc-by-sa and MIT license