[Mybatis/Oracle] 동일한 명칭의 컬럼이 있는 테이블 2개 Join하기

1 분 소요

목표

product 테이블과 partner_shop 테이블을 조인한 결과를 select하는 것이 목표이다.

image

이때, product 테이블의 상품명과 partner_shop 테이블 쇼핑몰 이름이 모두 name이라는 동일한 컬럼명으로 되어 있으서 단순히 resultmap을 작성한다면 뒤에 join한 테이블의 name 컬럼의 값은 앞에 join된 테이블의 name 컬럼 값으로 매핑되어 버린다.

그래서 oracle 쿼리에서 alias 기능을 사용하여 뒷 테이블의 컬럼명이 다른 값으로 담길 수 있도록 쿼리를 수정한 후, 해당 내역을 반영하여 resultmap을 등록해주어야 한다.

Oracle 쿼리

select P.*, S.NAME AS shop_name, s.reg_date as shop_reg_date
FROM PRODUCT P, partner_shop S
WHERE p.shop_code = s.code

Java VO

image

Mapper XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="shopping.ShoppingDAO" >

	<resultMap type="PartnerShopVO" id="PartnerShopMap">
		<result column="code" property="code" />
		<result column="site" property="site" />
		<result column="shop_name" property="name" /> 		  <!-- 컬럼명 겹쳐서 Alias한 컬럼 -->
		<result column="currency" property="currency" />
		<result column="shop_reg_date" property="regDate" />  <!-- 컬럼명 겹쳐서 Alias한 컬럼 -->
		<result column="nation_kr" property="nationKr" />
	</resultMap>
  
	<resultMap type="ProductVO" id="ProductMap">
		<result column="no" property="no" />
		<result column="url" property="url" />
		<result column="img" property="img" />
		<result column="brand" property="brand" />
		<result column="name" property="name" />
		<result column="price" property="price" />
		<result column="currency" property="currency" />
		<result column="reg_date" property="regDate" />
		<result column="admin_id" property="adminId" />
		<result column="seller_id" property="sellerId" />
		<result column="shop_code" property="shopCode" />
		<collection property="partnerShopVO" resultMap="PartnerShopMap" />
	</resultMap>

	<select id="selectAllProduct" resultMap="ProductMap">
		select P.*, S.NAME AS shop_name, s.reg_date as shop_reg_date
		FROM PRODUCT P, partner_shop S
		WHERE p.shop_code = s.code
	</select>
</mapper>