반응형
mybatis association, inner class , embeded
innerclass를 이요해서 mybatis 의 Obejct 맵팽을 위해서는 다음과 같이 사용 할 수 있다.
특히 JPA 사용사 멀티 PK를 사용한 Entity 를 사용시 @embeded 를 이요한 내부 Class 를 이용할때 혹은 객체를 이용할때 association
tag는 유용하다.
innnerClass 선택은 xml 에서 $을 . 대신에 사용해 준다.
Entity Class 생성
AdsEntityPK 를 내부 Class로 가지고 있다.
@Entity
@Table(name = "ads")
@Getter@Setter
@EqualsAndHashCode(callSuper = true, exclude = {"adGroupEntity"})
@ToString(exclude = {"adGroupEntity"}, callSuper = true)
public class AdsEntity extends AbstractCommonMetaEntity implements Serializable {
/**
* serialVersionUID.
*/
private static final long serialVersionUID = 1L;
@Embeddable
@Getter
@Setter
@EqualsAndHashCode
@ToString
public static class AdsEntityPK implements Serializable {
/**
* serialVersionUID.
*/
private static final long serialVersionUID = 1L;
/**
* 캠페인 아이디.
*/
private String campaignId;
/** 미디어 아이디 ( 구글, 페이스북....). */
private String mediaId;
/** 광고 그룹 아이디. */
private String adGroupId;
/**
* 광고 아이디.
*/
private String adId;
}
@EmbeddedId private AdsEntityPK adsEntityPK;
/**
* 목표(캠페인 타입 : 동영상 / 배너 / 검색).
*/
private String objective;
/**
* 소재 아이디.
*/
private String creativeId;
/**
* 광고 이름.
*/
private String adName;
/**
* 상태 (유효/삭제/일시정지/보관).
*/
private String status;
/** 광고계정. */
private String customId;
private Date startTime;
private Date endTime;
/**
* 지면 플랫폼 정보(유트브/검색/앱/페이스북/인스타/배너).
*/
private String adNetworkType;
///////////////////////////////////////////
//Association 설정
///////////////////////////////////////////
/**
* 광고 그룹 정보 모델 클래스.
*/
@MapsId("adGroupEntityPK")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = AdGroupEntity.class)
@JoinColumns({
@JoinColumn(name = "campaignId", updatable = false, insertable = false, referencedColumnName = "campaignId"),
@JoinColumn(name = "mediaId", updatable = false, insertable = false, referencedColumnName = "mediaId"),
@JoinColumn(name = "adGroupId", updatable = false, insertable = false, referencedColumnName = "adGroupId"),
})
private AdGroupEntity adGroupEntity;
Mybatis Mapper XML 생성
resultMap Tag를 이용하여 id="adsEntityPK" 를 만들어주고 innerClass 사용은 $ 을 이용하여 선택해준다. 이후 사용하고자하는 select tag 에 resultMap을 생성한뒤
association Tag에 resultMap 을 Mapping 시켜준다.
- perperty : Class 에정의된 attribute 의 alias 값 일치 하도록
- resultMap : 미리정의한
id="adsEntityPK"
의 id 값
<resultMap id="adsEntity" type="com.cjenm.report.library.domain.entity.AdsEntity">
<association property="adsEntityPK" resultMap="adsEntityPK"/>
</resultMap>
위와 같이 작성해 주어도 autoMapping="true" 가 기본 값임 으로 result를 별도로 적어 주지 않아도 자동 Mapping 된다. (필드명과 다르다면 column 과 class의 field 를 매핑 시켜주어야 한다)
mybatis association tag 및 collection tag는 ORM 형태로 사용하기 위해 사용한다.
Mapper xml 전체
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cjenm.report.library.repository.mybatis.AdCreativeMapper">
<resultMap id="adsEntityPK" type="com.cjenm.report.library.domain.entity.AdsEntity$AdsEntityPK">
<result property="campaignId" column="campaign_id"/>
<result property="mediaId" column="media_id"/>
<result property="adGroupId" column="ad_group_id"/>
<result property="adId" column="ad_Id"/>
</resultMap>
<resultMap id="adsEntity" type="com.cjenm.report.library.domain.entity.AdsEntity">
<association property="adsEntityPK" resultMap="adsEntityPK"/>
</resultMap>
<select id="findAllByCampaignId" parameterType="Map" resultMap="adsEntity">
SELECT
`ad_id`,
`creative_id`,
`ad_name`,
`status`,
`ad_group_id`,
`campaign_id`,
`media_id`,
`custom_id`,
`master_id`,
`ad_network_type`,
`objective`,
`start_time`,
`end_time`,
`initial_collect_date`,
`last_collect_date`
FROM `ae_report`.`ads`
WHERE 1=1
AND campaign_id in
<foreach collection="list" item="campaignIds" separator="," open="(" close=")">
#{campaignIds}
</foreach>
AND media_id = #{mediaId}
</select>
</mapper>
반응형
'Spring > Spring Data JPA' 카테고리의 다른 글
Lombok @ToString , JPA 사용시 주의 사항 (0) | 2021.05.25 |
---|---|
mybatis Cause: java.lang.IllegalArgumentException: argument type mismatch” (0) | 2021.04.29 |
mybatis 문법 foreach (0) | 2021.04.29 |
JPA Inner Join , left join (0) | 2020.09.08 |
JPA paging 속성 (0) | 2020.07.23 |