본문 바로가기
study/java&JSP

ibatis - queryForObject null 반환

by 휘루걸음 2011. 1. 18.
728x90
반응형

 

반응형
728x90

 

iBatis (혹은 MyBatis)의 queryForObject 메서드가 null을 반환하는 경우에는 주로 쿼리 결과가 없는 경우나 결과가 null인 경우입니다. 이에 대한 처리를 적절하게 해주어야 합니다.

1. 쿼리 결과가 없는 경우
   - queryForObject 메서드는 단일 행을 기대하므로, 결과가 없는 경우 null이 반환됩니다.
   - 결과가 없는 경우에 대한 처리를 해주어야 합니다.

    YourObjectType result = (YourObjectType) sqlMapClient.queryForObject("yourQueryId", parameterObject);

    if (result != null) {
        // 결과가 있는 경우 처리
    } else {
        // 결과가 없는 경우 처리
    }



2. 쿼리 결과가 null인 경우
   - 만약 쿼리 결과가 null을 반환하는 경우, queryForObject는 그대로 null을 반환합니다.
   - 결과가 null인 경우에 대한 처리를 추가로 구현해야 합니다.

    YourObjectType result = (YourObjectType) sqlMapClient.queryForObject("yourQueryId", parameterObject);

    if (result != null) {
        // 결과가 있는 경우 처리
    } else {
        // 결과가 null인 경우 처리
    }




3. XML 매핑 파일 확인
   - iBatis의 XML 매핑 파일에서 해당 쿼리를 확인하고, 반환 타입이 제대로 지정되어 있는지 확인합니다.
   - <resultMap>이나 <result> 등이 적절하게 설정되어 있는지 확인합니다.

<select id="yourQueryId" parameterClass="yourParameterClass" resultClass="YourObjectType">
        <!-- 쿼리 내용 -->
    </select>


 

4. 예외 처리 추가
   - `queryForObject` 메서드에서 발생하는 예외를 적절하게 처리할 수 있도록 try-catch 블록을 추가합니다.

  try {
        YourObjectType result = (YourObjectType) sqlMapClient.queryForObject("yourQueryId", parameterObject);
        // 결과가 있는 경우 처리
    } catch (SQLException e) {
        e.printStackTrace();
        // 예외 처리
    }




이러한 접근 방법들을 통해 queryForObject 메서드가 null을 반환하는 경우에 대한 처리를 보다 효과적으로 수행할 수 있습니다.


출처 :

http://blog.naver.com/tykim00/90086378689


queryForList는 아래 단계를 거쳐 결국은 GeneralStatement 객체로 간다.

1. public class SqlMapClientImpl implements ExtendedSqlMapClient {
public List queryForList(String id) throws SQLException {
        return getLocalSqlMapSession().queryForList(id);
    }

public class SqlMapSessionImpl implements SqlMapSession

2.
public List queryForList(String id, Object paramObject) throws SQLException {
        return _flddelegate.queryForList(session, id, paramObject);
    }
3.
public List queryForList(SessionScope session, String id, Object paramObject, int skip, int max)

4. public class GeneralStatement extends BaseStatement {

5. public class DefaultRowHandler implements RowHandler {

    public DefaultRowHandler() {
        list = new ArrayList(); //요것 때문이다.
    }

    public void handleRow(Object valueObject) {
        list.add(valueObject);
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    private List list;
}

그러나 queryForObject는
public class GeneralStatement extends BaseStatement {
....
public Object executeQueryForObject(RequestScope request, Transaction trans, Object parameterObject,
        Object resultObject) throws SQLException {
        try {
            Object object = null;
            DefaultRowHandler rowHandler = new DefaultRowHandler();
            executeQueryWithCallback(request, trans.getConnection(), parameterObject, resultObject, rowHandler, 0,
                -999999);
            List list = rowHandler.getList();
            if (list.size() > 1)
                throw new SQLException("Error: executeQueryForObject returned too many results.");
            if (list.size() > 0)
                object = list.get(0);
            return object; //--> 개수가 없을때 list의 사이즈가 0이므로 null을 환한하게 되어 있다.
        } catch (TransactionException e) {
            throw new NestedSQLException((new StringBuilder()).append(
                "Error getting Connection from Transaction.  Cause: ").append(e).toString(), e);
        }

728x90
반응형

'study > java&JSP' 카테고리의 다른 글

JSTL FUNCTION  (0) 2015.04.28
JAVA string 포맷 kst date 변환  (0) 2015.04.21
날짜형식  (0) 2015.02.24
java method  (0) 2011.06.16
java date 날짜 구하기  (0) 2011.05.17