아이템 디테일 API - 좋아요 표시 관련 에러

2023. 5. 8. 23:58프로젝트 개발 및 운영 이슈

 

(2021년 작성됨)

 

문제 상황 : 아이템을 좋아요 요청, 취소한 후 아이템 디테일 페이지 확인 시 아이템 데이터를 불러오지 못함.

  • Sentry.io를 통해서 에러 로그 확인 → querydsl에서 .fetchOne() 호출한 결과가 유니크하지 않다는 에러

javax.persistence.NonUniqueResultException: query did not return a unique result: 2

 

  • DB에서 user_item 테이블을 조회해보니, 실제로 데이터가 두개 나왔다.

위처럼 하나가 나와야하는데, 좋아요를 했는지 여부인 col_1_0_ 값이 0, 1인 데이터 두개가 출력되었음.

 

  • 수정 전 querydsl
 queryFactory.select(item, new CaseBuilder().when(userItem.user.id.eq(userId)).then(1L).otherwise(0L))
                            .from(item)
                            .leftJoin(userItem).on(userItem.item.eq(item))
                            .where(item.id.eq(itemId))
                            .fetchOne();

 

  • 수정 후 querydsl - .groupBy().sum() 를 통해 해결했다.
queryFactory.select(item, new CaseBuilder().when(userItem.user.id.eq(userId)).then(1L).otherwise(0L).sum())
                            .from(item)
                            .leftJoin(userItem).on(userItem.item.eq(item))
                            .where(item.id.eq(itemId))
                            .groupBy(item)
                            .fetchOne();