mybatis + mysql 질문입니다.

598 views
Skip to first unread message

이광연

unread,
Aug 13, 2014, 4:22:42 AM8/13/14
to ks...@googlegroups.com
mybatis로 db처리하고 있는데 막히는 부분이 있어서 질문 남깁니다.

유저의 팔로워 목록을 가져오는데 팔로워들이 좋아요한 목록까지 같이 가져오려고 합니다.

리턴되는 결과는 List<User>이고 구조는 아래와 같습니다.

class User {
    string name;
    string image;
    List<Like> likes;
}

class Like {
    string title
    string image;
}

테이블은 유저, 팔로워, 좋아요, 글 이렇게 4개입니다.

10번 유저의 팔로워를 가져온다고 하면

팔로워 테이블에서 10번 유저를 팔로윙한 유저들을 찾아서 유저 테이블과 조인해서 기본 정보를 가져오고

좋아요 테이블에서 유저가 좋아요 한 글 목록을 불러오고 글 테이블과 조인하여 글정보를 가져오는 것입니다.

조인 이용하고 <collection> 이용해서 하려니까 잘 안되네요..

팔로워 1명이 좋아요한 글이 10개면 User 오브젝트가 10개 나오고 

각각의 User 오브젝트마다 Like가 한개씩 들어가도록 나오네요.

팔로우 유저를 가져와서 다시 유저를 반복하면서 like를 가져오도록 쿼리 날리지 않고 한번에 처리할 수 있을까요? 

김주열

unread,
Aug 13, 2014, 4:43:45 AM8/13/14
to ks...@googlegroups.com
collection으로 가져오려면 Join하면 안되지 싶습니다. (<association>인 경우에 join)

별도로 <select id="selectLikes" parameterType="String" resultType="Like">....</select> 를 만들어서 

<collection property="likes" ofType="Like" column="name" select="selectLikes" />

이런식으로 하면 되지 않을까 생각합니다.



2014년 8월 13일 수요일 오후 5시 22분 42초 UTC+9, 이광연 님의 말:

이광연

unread,
Aug 13, 2014, 7:43:40 AM8/13/14
to ks...@googlegroups.com
김주열님 답변감사합니다.

거기까지는 진행이 되었는데

유저가 좋아요한 글이 여러 개라서 collection의 select에 여러 개의 id를 넘겨 in으로 처리하고 싶은데

이부분에서 잘 안되네요.

지금은 유저가 좋아요한 글이 10개라면 같은 유저가 10개가 select되고 각각이 collection으로 1개씩 처리가 되네요.

김주열

unread,
Aug 13, 2014, 8:43:51 AM8/13/14
to ks...@googlegroups.com
Parameter로 여러개의 id를 list나 map collection으로 넘길 수 있다면,

myBatis의 foreach를 사용하시면 될듯합니다.

아래에 myBatis 매뉴얼에서 그대로 복사해서 붙입니다.


foreach

동적 SQL 에서 공통적으로 필요한 것은 collection 에 대해 반복처리를 하는 것이다. 종종 IN 조건을 사용하게 된다. 예를 들면,

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

foreach 요소는 매우 강력하고 collection 을 명시하는 것을 허용한다. 요소 내부에서 사용할 수 있는 item, index 두가지 변수를 선언한다. 이 요소는 또한 열고 닫는 문자열로 명시할 수 있고 반복간에 둘 수 있는 구분자도 추가할 수 있다.

참고 파라미터 객체로 MyBatis 에 List 인스턴스나 배열을 전달 할 수 있다. 그렇게 하면 MyBatis 는 Map 으로 자동으로 감싸고 이름을 키로 사용한다. List 인스턴스는 “list” 를 키로 사용하고, 배열 인스턴스는 “array” 를 키로 사용한다.

XML 설정 파일과 XML 매핑 파일에 대해서는 이 정도에서 정리하고, 다음 섹션에서는 Java API 에 대해 좀더 상세하게 살펴볼 것이다.


--


아니면 쿼리를 올려보시면 능력자님들이 금방 해결해드리지 않을까 싶습니다. 



2014년 8월 13일 수요일 오후 8시 43분 40초 UTC+9, 이광연 님의 말:
Reply all
Reply to author
Forward
0 new messages