Develop

[Mybatis] 반복되는 같은 쿼리 sql 로 정의해서 include 해서 변수처럼 사용하기

issuemaker99 2024. 9. 3. 15:10
728x90

mybatis 로 쿼리를 작성하다보면 동일한 쿼리가 여러곳에 들어가는 경우가 생긴다

특히 postgresql 로 보면 with 같은 쿼리는 여러곳에서 반복적으로 사용할 수 있다. 그럴때 마다 같은 쿼리를 매번 작성하기 보단

변수처럼 sql 로 정의해서 include 해서 사용하면 효율적이다. 

 

상단에 with 쿼리를 anpdsmDispCat_with_adc 로 정의하고 

<include refid = "anpdsmDispCat_with_adc"/> 를 사용해 쿼리를 불러올 수 있다. 

물론 <select id="getDispCatListInq" parameterType="DispCatMgntDto" resultType="DispCatMgntDto">

서비스의 파라미터도 사용할 수 있다. 

 

주의할점) include 하는 곳보다 상단에 위치할 것.

 

<mapper namespace="net.grovesoft.anp.mapper.prdMgnt.PrdMgntMapper">

	<sql id="anpdsmDispCat_with_adc">
		WITH RECURSIVE adc (anp_disp_cat_cd, upp_anp_disp_cat_cd, disp_cat_nm, disp_cat_thmb_bimg_file_url, clr_infr_incl_yn, disp_cat_txt, sort_sn, usg_yn, disp_cat_depth) AS (
		  SELECT
		    w1.anp_disp_cat_cd, w1.upp_anp_disp_cat_cd, w1.disp_cat_nm, w1.disp_cat_thmb_bimg_file_url, w1.clr_infr_incl_yn, w1.disp_cat_txt, w1.sort_sn, w1.usg_yn, 1 AS disp_cat_depth
		  FROM
		    anp.anpdsm_disp_cat w1
		  WHERE
		    w1.upp_anp_disp_cat_cd = 'root' and anp_site_cd = #{userDto.siteCd}
		  UNION ALL
		  SELECT
		    w2.anp_disp_cat_cd, w2.upp_anp_disp_cat_cd, w2.disp_cat_nm, w2.disp_cat_thmb_bimg_file_url, w2.clr_infr_incl_yn, w2.disp_cat_txt, w2.sort_sn, w2.usg_yn, (disp_cat_depth + 1) AS disp_cat_depth
		  FROM
		    anp.anpdsm_disp_cat w2 
		    INNER JOIN adc 
		    ON w2.upp_anp_disp_cat_cd = adc.anp_disp_cat_cd and w2.anp_site_cd = #{userDto.siteCd}
		)
	</sql>

	<!-- 전시 카테고리 조회  -->
	<select id="getDispCatListInq" parameterType="DispCatMgntDto" resultType="DispCatMgntDto">
        <include refid = "anpdsmDispCat_with_adc"/>
		SELECT 
			anp_disp_cat_cd
			, upp_anp_disp_cat_cd
			, disp_cat_nm
			, disp_cat_thmb_bimg_file_url
			, disp_cat_txt
			, sort_sn
			, clr_infr_incl_yn
			, usg_yn
		FROM adc
		where disp_cat_depth = #{dispCatDepth}
		order by upp_anp_disp_cat_cd, sort_sn
    </select>
</mapper>

 

 

LIST