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 (1) | 2011.06.16 |
java date 날짜 구하기 (0) | 2011.05.17 |