반응형
나는 질문(Question) 1 : N 답변(Answer) 로 구성을 하고, 하나의 질문을 조회할 때는 그 질문에 대한 답변을 가져오기로 했다.
근데 가져온 데이터가 중복이 된 것.
{
"status": "OK",
"code": 0,
"message": "정상 처리 되었습니다",
"data": [
{
"id": 1,
"content": "질문01",
"views": 7,
"createdAt": "2024-06-20T11:59:45",
"modifiedAt": "2024-06-24T18:44:59.361887"
},
{
"id": 1,
"content": "질문01",
"views": 7,
"createdAt": "2024-06-20T11:59:45",
"modifiedAt": "2024-06-24T18:44:59.361887"
},
{
"id": 1,
"content": "질문01",
"views": 7,
"createdAt": "2024-06-20T11:59:45",
"modifiedAt": "2024-06-24T18:44:59.361887"
},
{
"id": 1,
"content": "질문01",
"views": 7,
"createdAt": "2024-06-20T11:59:45",
"modifiedAt": "2024-06-24T18:44:59.361887"
},
{
"id": 2,
"content": "질문02",
"views": 1,
"createdAt": "2024-06-22T13:53:23",
"modifiedAt": "2024-06-22T14:29:10.555751"
},
{
"id": 3,
"content": "질문03",
"views": 0,
"createdAt": "2024-06-22T13:53:46",
"modifiedAt": "2024-06-22T13:53:46"
}
]
}
data의 id가 1인 데이터가 4개나 있다.
이를 해결법을 찾아보니, 2가지 방법이 있었다.
- Set 사용하기
- Distinct 사용하기.
하지만 Set 같은 경우에는 나중에 페이징 처리가 힘들어서 보통 Distinct 를 사용하는 것 같다.
public List<GetQuestionsRes> findAllByQuery(String query) {
// 질문 응답 DTO
QGetQuestionsRes qGetQuestionsRes = new QGetQuestionsRes(
question.id,
question.content,
question.views,
question.createdAt,
question.modifiedAt
);
return jpaQueryFactory.select(qGetQuestionsRes)
.from(question)
.leftJoin(answer)
.on(question.id.eq(answer.question.id))
.where(question.content.containsIgnoreCase(query))
.distinct() // 여기 추가 !!
.fetch();
}
[Hibernate]
select
distinct q1_0.id, -- 여기 distinct 추가됨!!
q1_0.content,
q1_0.views,
q1_0.created_at,
q1_0.modified_at
from
questions q1_0
left join
answers a1_0
on q1_0.id=a1_0.question_id
where
lower(q1_0.content) like ? escape '!'
{
"status": "OK",
"code": 0,
"message": "정상 처리 되었습니다",
"data": [
{
"id": 1,
"content": "질문01",
"views": 7,
"createdAt": "2024-06-20T11:59:45",
"modifiedAt": "2024-06-24T18:44:59.361887"
},
{
"id": 2,
"content": "질문02",
"views": 1,
"createdAt": "2024-06-22T13:53:23",
"modifiedAt": "2024-06-22T14:29:10.555751"
},
{
"id": 3,
"content": "질문03",
"views": 0,
"createdAt": "2024-06-22T13:53:46",
"modifiedAt": "2024-06-22T13:53:46"
}
]
}
해결!
반응형
'TIL ✍️' 카테고리의 다른 글
24/07/30(화) 88번째 TIL : Access token & Refresh token 요청/응답 방식과 양식 (1) | 2024.07.30 |
---|---|
24/07/29(월) 87번째 TIL : 어노테이션으로 AOP 적용하기 (0) | 2024.07.29 |
24년 6월 22일(토요일) - 85번째 TIL : 요청 DTO 검증 시 정규표현식으로 하기 (0) | 2024.06.23 |
24년 6월 20일(목요일) - 84번째 TIL : JPA 에서 SoftDelete 처리 (0) | 2024.06.20 |
24년 6월 18일(화요일) - 83번째 TIL : Access token, Refresh token 응답 및 저장 방식 (1) | 2024.06.18 |