querydsl dto mapping & subquery 질문 남깁니다.
3218
작성한 질문수 9
안녕하세요 열심히 수업듣고 따라하고있는 수강생입니다.
먼저 매번 답변주셔서 감사합니다.
질문으로는 dto mapping 에서 @queryprojection 으로 직접 조회를 해야하는 상황입니다.
글 : 채팅방 1 : N
채팅방 : 채팅 1: N
일때
DTO 는
@Data
public class QChatRoomDto {
private QaType qaApart;
private String qaContent;
private String searchPlace;
private String category;
private Long chooseMemberIdx; // 채택 / 미채택 기준
private Long roomIdx;
private Long otherMemberIdx;
private String otherMemberNickname;
private String otherMemberImgDto;
private int qaCount;
private String modifiedDate;
private String recentlyMsg;
private String recentlyMsgType;
private Long notReadCount;
@QueryProjection
public QChatRoomDto(String qaContent, String searchPlace, String category, Long chooseMemberIdx, Long roomIdx, Long otherMemberIdx, String otherMemberNickname, String otherMemberImgDto, int qaCount, LocalDateTime modifiedDate, String recentlyMsg, String recentlyMsgType, Long notReadCount) {
this.qaApart = QUESTION;
this.qaContent = qaContent;
this.searchPlace = searchPlace;
this.category = category;
this.chooseMemberIdx = chooseMemberIdx;
this.roomIdx = roomIdx;
this.otherMemberIdx = otherMemberIdx;
this.otherMemberNickname = otherMemberNickname;
this.otherMemberImgDto = otherMemberImgDto;
this.qaCount = qaCount;
this.modifiedDate = modifiedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
this.recentlyMsg = recentlyMsg;
this.recentlyMsgType = recentlyMsgType;
this.notReadCount = notReadCount;
}
}
querydsl
public Page<QChatRoomDto> myQuestionChatRoomList(Member questionMember, List<Member> blockMembers, QaStatusType qaStatusType, Pageable pageable) {
return applyPagination(pageable, contentQuery -> contentQuery
.selectDistinct(new QQChatRoomDto(
qa.content.as("qaContent"),
qa.searchPlace.as("searchPlace"),
qa.category.name.as("category"),
qa.selectMember.idx.as("chooseMemberIdx"),
chatRoom.idx.as("roomIdx"),
chatRoom.aMember.idx.as("otherMemberIdx"),
chatRoom.aMember.nickname.as("otherMemberNickname"),
chatRoom.aMember.memberImg.as("otherMemberImgDto"),
chatRoom.qMember.qaList.size().as("qaCount"),
chatRoom.modifiedDate.as("modifiedDate"),
ExpressionUtils.as(
JPAExpressions.select(chat.content)
.from(chat)
.where(chat.chatRoom.eq(chatRoom),
chat.idx.eq(
JPAExpressions.select(chat.idx.max())
.from(chat))
), "recentlyMsg")
,
ExpressionUtils.as(
JPAExpressions.select(chat.chatType)
.from(chat)
.where(chat.chatRoom.eq(chatRoom),
chat.idx.eq(
JPAExpressions.select(chat.idx.max())
.from(chat))
), "recentlyMsgType"),
ExpressionUtils.as(
JPAExpressions.select(chat.count())
.from(chat)
.where(chat.chatRoom.eq(chatRoom),
chat.member.ne(questionMember),
chat.readMsg.isFalse()), "notReadCount")
)
)
.from(chatRoom)
.join(chatRoom.qa, qa)
.join(chatRoom.aMember, member)
.where(chatRoom.qMember.eq(questionMember),
isQaSelectMember(questionMember, qaStatusType),
blockAMembersNotIn(blockMembers),
chatRoom.idx.notIn(
JPAExpressions.select(chatRoom.idx)
.from(chatRoom)
.where(chatRoom.isLeave.contains("_" + questionMember.getIdx() + "_"))),
member.phoneNum.isNotNull()
)
.orderBy(chatRoom.modifiedDate.desc()));
}이렇게 작업을 했습니다. 매우 이상한 쿼리이겠지만 저한텐 이게 최선이었습니다 ㅠ
여기서 궁금한점은 채팅룸 리스트를 뽑아야 하는데
recentlyMsg, recentlyMsgType
채팅 리스트의 최근 데이터를 가지고 오고싶었으나
subQuery에서 limit 1 이 먹히지 않아
저런 괴랄한? 쿼리를 만들어 작동은 되게 만들었습니다.
해서 dto mapping 할때 컬렉션 리스트를 뽑는 다른 방법이 있는지 궁금합니다.
chatRoom.chatlist 를 반환하여 queryprojection에서 가공하려 했지만
에러가 뜨면서 chatList는 반환이 안되어 질문글 남깁니다.
감사합니다.
답변 1
join에대해 질문드립니다.
0
24
1
SpringBoot 4.X에서의 Querydsl 설정
0
199
2
querydsl 오픈소스에 대한 질문
1
109
1
예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?
0
136
1
Querydsl 6.X버전에 대해서 어떻게 생각하시나요?
0
364
2
여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요
1
96
1
fetchResults()는 더이상 권장되지 않는다는데 맞나요?
0
182
1
querydsl sum() 메서드 없어요.
0
180
2
build 디렉터리 생성
0
158
2
자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?
0
130
2
현재 Querydsl에서 from절 서브쿼리를 지원하나요?
0
107
1
오타 제보 드립니다.
0
84
2
벌크 연산과 flush, clear
0
91
1
Run As Intellij 로 변경시 Q타입 import 불가
0
100
1
QHello import하기 문제 발생
0
165
2
등록된 함수 보는법(H2Dialect) 질문
0
87
2
5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의
1
214
2
[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??
1
219
1
querydsl 설정 문제
0
234
2
quey dsl 설정부분
0
176
2
count 쿼리 관련 질문입니다!
0
81
1
stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.
0
101
1
답변부탁드리겠습니다.
0
97
2
(OrderSpecifier)관련 내용 어디있을가요
0
68
1





