ghdrptkd
252
2017-06-19 20:13:02.0
3
197

mybatis 중복결과 덮어침 관련 질문 드립니다.


A 테이블

IDUSERIDDATECNT
13어제2
23어제4


B 테이블


IDNAME
3USER1
4

USER2

5

USER3


package a.b.bean;

Class Bean {
 int id;
 int cnt;
 User user;

   // getter, setter;
}
Class User {
   int id;
   String name;

  // getter, setter;
}


<resultMap id="resultMap" type="a.b.bean">
    <result property="cnt" column="CNT" />
    <association property="user" javaType="a.b.User">
       <result property="id" column="ID" />
       <result property="name" column="NAME" />
    </association>
</resultMap>
<select id="selectQuery" resultMap="resultMap">
SELECT b.ID, b.NAME, IFNULL(a.CNT, 0) AS CNT
FROM
(
            SELECT USERID, SUM(CNT) AS CNT
            FROM A테이블
            WHERE DATE >= 어제
            AND DATE <= 오늘
            AND USERID IN ( 3, 4, 5 )
            GROUP BY USERID
) a RIGHT JOIN (
            SELECT ID, NAME
            FROM B테이블
            WHERE USERID IN ( 3, 4, 5 )
) b
ON a.USERID  = b.ID
</select>

현재 mybatis에서 사용중인 쿼리 입니다.


해당 쿼리의 결과는 

IDNAMECNT
3USER16
4USER20
5

USER3

0

입니다.

여기까지는 잘 나옵니다.


문제는 결과값을 들고 script에서 확인해보면 user1과 user3밖에 보이지 않습니다.


  result[0] : {

    cnt : 6

    user : {id: 3, name: user1}

  }

  result[1] : {

    cnt : 0

    user : {id: 5, name: user3}

  }


이렇게 나오더라고요.... ㅠ

의심가는 부분은 user가 같은 객체이니 구분값이 없기에 마지막것으로 덮어쳐지는게 아닌가 싶습니다.

혹시 이러한 경우엔 어떻게 해줘야 될까요 ㅠ...


임시로 userid를 키값으로 추가하여 넣어놓긴 했는데 앞으로도 이러한 이슈가 생기지 않을거란 장담을

할 수 없어서 질문드립니다.

0
0
  • 답변 3

  • 정의된 리절트 맵을 살펴보면 각각의 레코드를 구분할 수 있는 컬럼이 없습니다. 따라서 cnt 컬럼을 기준으로 중복된 값은 마지막 레코드만 남아 있습니다. 따라서 다음과 같이 식별 컬럼을 추가하시면 됩니다.

    <resultMap id="resultMap" type="a.b.bean">
        <id property="id" column="ID" />
    <result property="cnt" column="CNT" /> <association property="user" javaType="a.b.User"> <result property="id" column="ID" /> <result property="name" column="NAME" /> </association> </resultMap

    PS) 각각의 레코드를 구분하는 컬럼은 result 속성 대신 id 속성을 지정하시면 됩니다.

    0
  • ghdrptkd
    252
    2017-06-20 00:20:54.0

    대전님께서 말씀해주신게 해결방안의 유일한걸까요...? 해당 부분처럼 처리하여 b테이블의 id를 가져와서 처리하긴 했지만 따로 옵션이나 그러한 걸로 거를 수 있는 방법은 없는지요??

    0
  • 대전개발자커뮤니티
    664
    2017-06-20 10:59:02.0
    리절트 맵은 속성은 단지 조회된 테이블 컬럼과 연관된 자바 프로퍼티에 매핑해주는 중간 메모리 역할을 할 뿐입니다.
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.