[Spring] MyBatis resultMap collection 사용법
개요
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 파라미터 여러개 사용 시 주의점
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?)".
라는 오류가 뜬다.
괄호 안에 명시된 순서대로 태그를 작성해야 한다는 뜻이다.
'Spring' 카테고리의 다른 글
[Spring] 유저별로 메뉴 다르게 보이기 (0) | 2021.06.29 |
---|---|
[Spring] Mybatis collections 파라미터 여러개 사용 시 주의점 (2) | 2021.06.28 |
[Spring] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 오류 (0) | 2021.04.14 |
[Tomcat에러] Result Maps collection already contains value for ... (0) | 2021.03.23 |
[Spring] @RequestMapping 중복 (0) | 2021.03.23 |
댓글