[링크] MyBatis 1:N select 결과 매핑하는 예제 (e.g. 게시물 목록조회시 게시물당 첨부파일목록을 함께 조회하여 그룹핑, group, collection, one to many)

By | 7월 8, 2021

[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에 관여하는 것으로 추정되는데 확실하지는 않다.

자작 샘플 (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>
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments