Mybatis 에서 multiple select key 사용하기. Could not set property , Error selecting key or setting result to parameter object 에러 해결하기. 마이바티스

작성: 2021.06.01

수정: 2021.06.01

읽는시간: 00 분

Programming/JPA ⁄ Spring

반응형

Mybatis 에서 multiple select key  사용하기. Could not set property , Error selecting key or setting result to parameter object 에러 해결하기


Mybatis의 Select key 를 쓰다 보면 한번에 여러개의 값을 select 해와야 할 때가 있습니다.

저의 경우에는 issue 라는 테이블에 저장되는 넘버 값이

1. 전체 프로젝트에서 해당 issue 의 넘버

2. 해당 issue 가 속한 프로젝트에서의 해당 issue 넘버

 

이렇게 두개의 넘버 값이 저장 됩니다. 테이블 구조는 아래와 같습니다.

 

그러다 보니 select key 에서 issue_sid, issue_no 값을 받아오고 난 후에 insert 를 해야 하는데요,

처음에는 select key를 두번 넣었더니 당연하게도 에러가 발생했습니다.

 

검색을 해보니 MyBatis 3.2.6 부터 쓸 수 있는 multiple select key 를 활용 하면 된다고 합니다.

그래서 처음 작성했던 selectKey는 다음과 같습니다.

		<selectKey keyProperty="issue_sid,issue_no" resultType="map" order="BEFORE" >
			select *
			from
				(select max(issue_sid)+1 as issue_sid
				from issue) a,
				(select max(issue_no)+1 as issue_no
				from issue
				where proj_no = #{proj_no})b
		</selectKey>

이렇게 했더니, selectKey 로 분명 조회는 잘 하는데,

 

Replection 을 이용해 해당 값들을 받아 오는 과정에 문제가 있었습니다.

map 에서 getter로 받아오는 것과 VO에서 자바 빈 규약에 맞춰 getter로 받아오는데서 생기는 괴리 때문인 듯 합니다.

Error getting generated key or setting result to parameter object.

Error selecting key or setting result to parameter object

에러가 발생합니다.

 

그래서 resultType 에 map 대신에 필요한 field 를 담은 클래스며 getter , setter 를 갖추고 있는 해당 VO 를 resultType 으로 지정하여 새로 해 보았습니다. 아래는 insert 쿼리 전문 입니다.

<insert id="insertIssue" parameterType="best.gaia.vo.IssueVO">
		<selectKey keyProperty="issue_sid,issue_no" resultType="best.gaia.vo.IssueVO" order="BEFORE" >
			select *
			from
				(select max(issue_sid)+1 as issue_sid
				from issue) a,
				(select max(issue_no)+1 as issue_no
				from issue
				where proj_no = #{proj_no})b
		</selectKey>
			INSERT INTO issue (
			    issue_sid,
			    issue_no,
			    mem_no,
			    label_no,
			    milest_sid,
			    proj_no,
			    issue_title,
			    issue_create_date,
			    issue_start_date,
			    issue_end_date,
			    issue_priority
			) VALUES (
			    #{issue_sid}
			    ,#{issue_no}
			    ,#{mem_no,jdbcType=NUMERIC}
			    ,#{label_no,jdbcType=NUMERIC}
			    ,#{milest_sid,jdbcType=NUMERIC}
			    ,#{proj_no,jdbcType=NUMERIC}
			    ,#{issue_title,jdbcType=VARCHAR}
			    ,sysdate
			    ,#{issue_start_date,jdbcType=VARCHAR}
			    ,#{issue_end_date,jdbcType=VARCHAR}
			    ,#{issue_priority, jdbcType=VARCHAR}
			)
	
	</insert>

 

이렇게 했더니 문제 없이 잘 insert 되는 것을 확인 할 수 있었습니다. 이상입니다.

 

반응형