여러개의 테이블을 조인한 결과는 어디에 담지?
ORM이란개 Object Relational Mapping 이라고...
그중에 하나의 테이블이 아닌 여러개의 테이블을 조인한 Mapping은 어떻게 할까.. 고민...그러다가 알게 된 것이다.
<sqlMap namespace="Member">
<resultMap id="get-member" class="member">
<result property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<resultMap id="get-member-result" class="member" extends="get-member"><== a) Main List
<result property="user.id" column="user_id"/>
<result property="user.password" column="password"/>
<result property="studyHistory" column="{id=id}" select="getStudyList" /> <== b) SubList
</resultMap>
member와 user는 SqlMapConfig.xml에서 alias로 지정한 것이다.
<typeAlias alias="study" type="com.test.domain.Study"/>
<typeAlias alias="member" type="com.test.domain.Member"/>
<typeAlias alias="user" type="com.test.domain.User"/>
</typeAlias>
그래서 가져온 결과물은... 요렇게 해서 가져온다.
<select id="getMemberList" resultMap="get-member-result">
<![CDATA[
select a.seq as id, a.name as name,
a.user_id as user_id, b.password as password,
from member a, user b
where a.user_id=b.user_id
]]>
</select>
Member class에서 User Object를 선언하고 getXXX, setXXX 메소드를 추가한다.
<select id="getStudyList" parameterClass="study" resultMap="get-study-result">
<![CDATA[
select a.id, a.lec_num, a.lec_name
from study a
where a.id = #id#
]]>
</select>
이것은 앞의 getMemberList 를 실행하면서 각 회원의 getStudyList목록을 List형태로 리턴하게 된다.
검색조건에 추가할라믄 column="{id=id,seq=seq}" 와 같은 형식으로 추가한다.
ㅎㅎㅎ 참 좋은 기능이다. 그럼그렇지 이런게 안될리 없지... 잠시나마 ORM 보다 걍 막쓰는 JDBC가 더 좋다고 외쳐보려던 나의 생각을 다시 돌려본다.....