JPQL @Query 메소드에서 2개 이상의 프로젝션을 리턴할 때 어떤식으로 받아야 하는지 알아볼게요!!
스프링 프로젝트를 진행중에 생겼던 이슈에 대해 적어볼까 해요!
이번 이슈는 JPQL 에 관한 이슈에요. SQL 문을 짜는 것도 고역이었는데 그 이후에도 이슈가 생겨서 정말 뚝배기 깨질뻔했네요.
먼저 대략... 2시간에 걸쳐서 겨우겨우 SQL문을 완성했어요. 이번 포스팅에 필요한 부분만 올리자면!
select me.*, me.name , count(*) from member
~ group by ~;
많이 생략했지만 이것만 있어도 돼요! 겨우겨우 구현한 SQL 문! Mysql Workbench 에서 실행하면 결과 잘 나옵니다.
그런데! 프로젝션이 하나인 경우만 써봤는데... 이번 SQL문은 프로젝션이 두개라 당황스러웠어요.
프로젝션이란?
SELECT 절에 조회할 대상을 지정하는 것을 프로젝션이라 해요. [SELECT {프로젝션대상} FROM]으로 대상을 선택해요. 프로젝션 대상은 엔티티, 엠비디드 타입, 스칼라 타입이 있어요.
repository 인터페이스에 코드는 적어 놨는데... 여기서 멘탈 바사삭! me, count(me) 두개나 있으면... 메소드 리턴값을 뭘로 줘야하는거지...? 하고 말이죠. 몇시간동안 검색한 결과 2가지 방법을 찾았어요!
DTO를 만들어라!
me, count(me) 를 담을 객체가 필요했어요. 아래와 같이 만들어줘요!
{% codeblock %}
@Data
public class OrderMemberDto {
private Member member;
private Long countOrder;
public OrderMemberDto(Member member, Long countOrder) {
this.member = member;
this.countOrder = countOrder;
}
}
{% endcodeblock %}
위와 같이 DTO를 만들고 repository 의 메소드를 아래와 같이 바꿔주세요.
그리고 아래와 같이 테스트를 돌리면! 결과가 잘 나오네요! (JUnit 이용했어요!)
Object[] 를 이용하는 방법!
이번에는 Object[] 를 이용하는 방법을 설명할게요! 역시 me, count(me) 를 담을 무언가가 필요해요. 이번에는 Object[] 에 넣을거에요! repository에 메소드를 아래와 같이 바꿔주세요!
그리고 테스트 코드를 아래와 같이 만들어주세요. List의 size는 1이고 Object.length 는 2인 상태예요. Run 하면~~
아래와 같이 결과값이 잘 나옵니다!.
이상입니다!