2011-04-07 1 views
4

iBatis select 쿼리에 대한 ResultMap이 주어지면 ResultMap의 속성에 매핑 된 모든 열이 실제로 SQL 쿼리의 일부분 인 것처럼 보입니다.iBatis ResultMaps : 열 이름 <...>이 ResultSet에 없습니다.

특히 Resultmaps 내에 resultmaps가있을 때 ResultMaps를 다시 사용하려면 약간 짜증이납니다.

예 :이 내부 개체의 컬렉션을 보유 myPropName 및 someCollection을 들고 컨테이너 개체를로드하는 데 참여 사용하는 쿼리가있는 경우가 있기 때문에 물론

<resultMap id="myResultMap" 
     <result property="myPropName" column="myColumnName"/> 
     <result property="someCollection" resultMap="otherResultMap"/> 
    </resultMap> 

    <resultMap id="otherResultMap" groupBy="..." 
     <result property="otherPropName" column="otherColumnName"/> 
    </resultMap> 

,이 두 가지 결과 맵이 정의되어있다.

그러나 myPropName을 사용하여 컨테이너 객체를로드하기 만하면되지만 someCollection에 내부 객체를로드 할 필요가없는 다른 select 쿼리에 동일한 결과 맵 정의를 다시 사용하려는 경우

열 이름 'otherColumnName이' 이 ResultSet

에서 찾을 수 없습니다가 null 또는 빈 콜렉션 각각의 속성 경우와 someCollection을 초기화 할 수없는 가능성이 없다 : 오류 메시지 수 (이 경우 otherPropName)은 pres가 아닙니다. SQL 쿼리에 있습니까?

해당 scencario에 대해 다른 결과 맵을 작성해야합니까? iBatis를 (하지 MyBatis로 아직) 버전 2.3.4을 사용하여

...

답변

6

은 "문제는"모든 TypeHandler 구현입니다. 이러한 객체는 ResultSet에서 열 값을 추출하여 해당 Java 유형에 매핑해야합니다.

public Object getResult(ResultSet rs, String columnName) throws SQLException { 
    Object s = rs.getString(columnName); 
    if (rs.wasNull()) { 
     return null; 
    } else { 
     return s; 
    } 
} 

열이 ResultSet에 존재하지 않는 경우는, 라인 rs.getString(columnName)SQLException를 던졌습니다 : 예를 들어, StringTypeHandler 클래스에서이 같은 방법이있다. 이 오류를 피할 수있는 유일한 방법은 예외를 throw하는 대신 null을 반환하는 사용자 고유의 TypeHandler을 작성하는 것입니다.
어쨌든 두 개의 결과 맵을 사용하는 것이 좋습니다.

+0

그래서 ResultSetMetaData를 사용하여 열 이름에 대해 문의하는 iBatis TypeHandler가 없습니까? –

+0

네, 맞습니다. 올바른 방법은'ResultSetMetaData'를 사용하는 것입니다. 그러나 그것을하는 기존의'TypeHandler'를 모른다. – javanna