본문 바로가기

[Spring] MyBatis resultMap collection 사용법

곰곰킴 2021. 6. 18.

개요

mybatis에서 테이블 간의 1:N 관계를 select 할 때 resultMap의 collection을 활용하여 서브쿼리 형식으로 데이터를 가져올 수 있다.

사용 경험담

서브 쿼리를 직접 구현하지 않아도 되는 점에서 편리했다.

배달대행 관제 웹 프로젝트에서 라이더 별로 배차받은 주문 리스트를 갖고 오는 데 활용했다

소스 예제

DTO 설정

@Getter
@Setter
public class Rider{
    private Integer userIdx;
	... 중략
    private List<Order> orders;
}

 

서브쿼리 id 입력

<resultMap id="BaseResultMap" type="...">
    ... 중략
    <collection property="orders" column="IDX" javaType="java.util.ArrayList"
       ofType="..." select="selectOrderAssignListByUserIdx" /> 
</resultMap>

<select id="selectOrderAssignListByUserIdx" ...>
    select 
      ... 컬럼들
    from 
      ... 테이블
    where a.USER_IDX = #{userIdx,jdbcType=INTEGER}
      ... 중략
      
  </select>

 

주목할 점은 select = "" 부분이다. 서브쿼리의 id를 입력해준다.

해당 서브쿼리의 결과가 list result 형식으로 붙게 된다.

column에는 해당 서브 쿼리에 들어갈 파라미터를 넣어준다.

하나만 넣을 때는 위처럼 넣으면 모든 변수가 파라미터로 맞춰진다.

두 개 이상일 때는 column="{idx=IDX, var=VAR}"로 넣어주고

함수 부분에서는 parameterType="java.util.Map"으로 주고 #{idx}, #{var}로 사용하면 된다.

파라미터 여러 개 관련 주의사항

2021.06.28 - [Spring] - [Spring] Mybatis collections 파라미터 여러개 사용 시 주의점

 

[Spring] Mybatis collections 파라미터 여러개 사용 시 주의점

개요 collections 사용 시 parameter를 여러 개 사용할 때 서브 쿼리의 parameterType을 map으로 지정해야 한다. collections 사용 시 parameter를 여러 개 사용하는데 오류가 났다. mapper xml 같은 경우 요류를..

gomgomkim.tistory.com

property와 javaType은 result 때처럼 사용할 컬럼명, 타입을 기입해주면 된다.

반응형

결과

{
  "result": "SUCCESS",
  "data": {
   ...
    "riders": [
      {
        "idx": 16,
        ... 중략
        "orders": [
         {
          "idx": 883,
          ... 중략
         },{ 
          ... 
        ]
      }, ... 후략

 

라이더 정보 내부에 주문 정보를 포함해 결과가 도출된 것을 확인 가능할 것이다.

주의사항

MyBatis의 resultMap을 작성할 때 collection을 result나 association 보다 위에 쓰게 되면

The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)".

라는 오류가 뜬다.

괄호 안에 명시된 순서대로 태그를 작성해야 한다는 뜻이다. 

 

댓글