[mybatis] There is no getter for property named ..
parameterType="String" 매개변수로 넘겨서 이 값의 여부에 따라 쿼리가 변경되는 로직이 필요한데.
이경우, There is no getter for property named 'xxxx' in 'class 'xxxx'오류가 발생한다.
어떻게해야할까..?
아래와 같이 dao단에서 호출을 한다고 할때.
List<HashMap<String, Object>> selectXXXXAreaList(String searchTxt);
파라미터 명칭을 다른 이름으로 붙여도 정상동작한다.
<select id="selectXXXXAreaList" parameterType="String" resultType="HashMap">
/* XXXXMapper.selectXXXXAreaList */
SELECT AREA_CODE, AREA_P_NM+' '+AREA_NM as AREA_F_NAME
FROM T_XXXX_AREA
WHERE AREA_P_NM LIKE '%' + #{keyword} + '%'
OR AREA_NM LIKE '%' + #{keyword} + '%'
OR AREA_P_NM+' '+AREA_NM LIKE '%' + #{keyword} + '%'
ORDER BY AREA_CODE ASC
</select>
하지만 검색어 입력여부에 따라 추가적인 if 문(test)이 필요할 경우가 있는데
이 경우 넘어온 파라미터를 임의의 이름으로 사용할 경우 다음과 같은 예외가 발생한다..
<select id="selectXXXXAreaList" parameterType="String" resultType="HashMap">
/* XXXXMapper.selectXXXXAreaList */
SELECT AREA_CODE, AREA_P_NM+' '+AREA_NM as AREA_F_NAME
FROM T_XXXX_AREA
<if test="keyword != null and keyword != ''">
WHERE AREA_P_NM LIKE '%' + #{keyword} + '%'
OR AREA_NM LIKE '%' + #{keyword} + '%'
OR AREA_P_NM+' '+AREA_NM LIKE '%' + #{keyword} + '%'
</if>
ORDER BY AREA_CODE ASC
</select>
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException:
There is no getter for property named 'keyword' in 'class java.lang.String'
이때는 명칭을 '_parameter' 로 해야 정상적으로 동작한다.
<select id="selectXXXXAreaList" parameterType="String" resultType="HashMap">
/* XXXXMapper.selectXXXXAreaList */
SELECT AREA_CODE, AREA_P_NM+' '+AREA_NM as AREA_F_NAME
FROM T_XXXX_AREA
<if test="_parameter != null and _parameter != ''">
WHERE AREA_P_NM LIKE '%' + #{_parameter} + '%'
OR AREA_NM LIKE '%' + #{_parameter} + '%'
OR AREA_P_NM+' '+AREA_NM LIKE '%' + #{_parameter} + '%'
</if>
ORDER BY AREA_CODE ASC
</select>
2021-05-17 추가..
일반적으로 우리는 이런 방식으로 작성하는데,
이는 다른 유형에 적용되지만 String의 경우 다음 예외가 발생합니다.
There is no getter for property named 'xxxxx' in 'class java.lang.String'
'class java.lang.String'에 'type'이라는 속성에 대한 getter가 없습니다.
MyBatis는 매개 변수가 String이면 인터페이스 메소드의 매개 변수가 무엇이든 상관없이 ES21en.xml의 참조를 인식하려면 _parameter로 변경해야합니다.
다른 동적 SQL 태그는 문자열을 처리 할 때 동일한 문제가 있습니다.