post 엔티티에는 OneToMany List타입의 comments 필드가 있고
comment 엔티티 에는 ManyToOne Post타입의 필드가 있다.
comments 필드에는 mappedBy post가 걸려있다.
comment 엔티티에는 대댓글을 위한 selfjoin이 걸려있고
OneToMany List<Comment> 타입의 childList 필드와 ManyToOne comment 타입의 parent 필드가 양방향으로 걸려있고
단방향으로는 Comment 타입의 group 필드가 있다.
이렇게 연관관계 설정이 되어있고 댓글과 대댓글을 표현하기위한 group 필드와 parent 필드 childList필드가 있다.
뷰에서 depth가 0인 댓글들을 보여주고
그 밑의 댓글들은 childList에서 가져다가 뿌려주는 방식으로 처음 가닥을 잡았다.
그래서 처음에는 post 엔티티에서 가져다가
comments 필드안에 있는 튜플들의 각각의 childList를 가져다가 뽑아줄려고 했으나
문제가 발생
Hibernate MultipleBagFetchException
(OneToMany 또는 ManyToMany 를 설정한 필드를 동시에 가져오려고 시도하면 나타나는 에러)
해결책은 List 타입을 Set 타입으로 변경하면 에러가 사라짐.
이외 에도 entitygraph를 사용하고 fetch join 시 조건을 줄수 없으므로
필드위에 @Where과 @OrderBy를 사용해서 쿼리를 만들었으나
가져오는 쿼리 where로 따로 가져오는 쿼리 orderby 정렬하는 쿼리 가 발생하여
총3번의 쿼리가 발생함.
그래서 그냥 comment 엔티티에서 값을 가져와서 뿌려주는 방식으로 변경
포스트 와 코멘트 2번 가져오는 쿼리로 변경.
그냥 querydsl로 뽑을때 nested하게 뽑으면 되는 상황이였다.
'개발 > jpa' 카테고리의 다른 글
Repository Interface에 @Respoitory가 없는 이유 (0) | 2020.08.15 |
---|---|
JPA (0) | 2020.03.03 |