2017-03-28 9 views
1

제 경우에는 jdbc를 올바르게 사용하는 방법을 알고 싶습니다.행을 반환하지 않는 경우 jdbc.queryForObject를 처리하는 방법

saveLinkHistory 열은 mysql에서 bit (1) 유형입니다. 내가 Incorrect result size: expected 1, actual 0의 오류가 발생했습니다 때까지

public boolean getIsSavedLinkHistory(String name) { 
     String sql = "select saveLinkHistory from users where name = ?"; 
     Boolean isTracked = jdbcTemplateObject.queryForObject(sql, new Object[] { name }, Boolean.class); 
     return isTracked; 
} 

이 쿼리는 때때로 name이 존재하지 않았기 때문에 queryForObject 방법은 내가 항상 결과로 1 개 행을 얻을 것으로 기대하고 잘 작동.

"name"이 (가) 존재하지 않는다는 예외를 던지면 어떻게 할 수 있습니까? 그리고 그런데 Boolean 여기입니까? 나는 전에 그런 코드를 보지 않았기 때문에.

+0

아무도 내 질문에 아무런 문제가 없으므로 아무도 의견을 말하지 않는 것처럼 보입니다. – Oleg

+0

질문 제목이 실제 문제와 관련이없는 것 같습니다. –

+0

@MarkRotteveel 감사합니다. 그 때 변경하겠습니다. – Oleg

답변

2

JdbcTemplate의 queryForObject 메소드는 쿼리가 항상 한 행을 반환해야하며, 그렇지 않으면 EmptyResultDataAccessException을 throw합니다. queryForObject 대신 ResultSetExtractor를 사용하여 query 메소드를 간단하게 사용할 수 있습니다. ResultSetExtractor - extractData (ResultSet rs) 메서드는 임의의 결과 객체를 반환하거나 데이터가 반환되지 않으면 null을 반환합니다. 널 (NULL)을 리턴하면 관련 예외를 던질 수 있습니다.

return jdbc.query(sql, new ResultSetExtractor<Boolean>() { 
    @Override 
    public Boolean extractData(ResultSet rs) throws SQLException, 
                DataAccessException { 
     return rs.next() ? rs.getBoolean("column_name") : null; 
    } 
});