[Mybatis] 1:N 관계 데이터 처리 data concatenation
주의사항
- resultMap > collection 을 사용할 경우
- collection 의 요소가 두 개 이상일 경우(거의 그렇겠지만) 평범한 페이징으로는 오류가 날 수 밖에 없다.
- offset, limit 등은 그룹핑 후에 걸어야 하는데, collection의 경우 쿼리가 다 끝나고 그룹핑 되므로
- 그래서 나는 그냥 resultMap-collection 패턴을 포기하고 주 레코드만 select 후, select된 목록의 pk만을 별도 배열로 만들어서 하위 컬렉션의 목록을 mybatis foreach in 조건 select 후 java에서 수동으로 객체 맵핑을 해 주었다.
- 하위 객체의 갯수가 2개 이상인 경우 collection, 한 건인 경우에는 association을 사용한다고 한다.
- collection 엘리먼트의 select 속성을 사용하여 row마다 쿼리할 경우 코딩은 편하겠지만 당연히 성능은 좋지 않다.
- automapping="true"를 사용하면 칼럼 매핑을 일일이 나열해 주지 않아도 된다.
- id 엘리먼트는 <collection />을 사용한 group by에 관여하는 것으로 추정되는데 확실하지는 않다.
- collection 의 요소가 두 개 이상일 경우(거의 그렇겠지만) 평범한 페이징으로는 오류가 날 수 밖에 없다.
자작 샘플 (association)
<resultMap id="selectUserListRM" type="UserListElemVO" autoMapping="true">
<id column="user_id" property="userId" />
<association property="hobby" javaType="UserListElemHobbyVO" autoMapping="true">
<id column="hobby_id" property="hobbyId" />
</association>
</resultMap>
<select id="selectUserList" resultMap="selectUserListRM">
select
...
</select>