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 되는 것을 확인 할 수 있었습니다. 이상입니다.