2017-01-29 5 views
3

데이터베이스 테이블 행을 Java 객체에 매핑하는 작동하는 RowMapper 코드가 있습니다. 나는 람다 표현식을 사용하여 구현을 변경하고 싶었다. 그러나 나는 항상 오류가 발생합니다. 코드 스 니펫은 다음과 같습니다.Java 람다 표현식을 사용하여 RowMapper를 구현하는 방법

String queryString = "select * from person where person_id = ? "; 
RowMapper rowMapper = (rs, rowNum) -> { 

Person p = new Person(); 

p.setName(rs.getString("personName")); 
p.setAddress(rs.getString("address")); 
p.setAge(rs.getInt("age")); 
} 

Person person = getJdbcTemplate().query(queryString, personId, rowMapper); 

return person; 

누군가 코드를 올바르게 구현할 수 있습니까? 명단을 가져올 생각이 있으십니까?

+0

는 컴파일 오류 란. '}'다음에 세미콜론을 놓치셨습니까? 'RowMapper'는 기능적인 인터페이스입니까? 어떤 버전의 스프링을 사용하고 있습니까? – CKing

+0

예, 일단 세미콜론 컴파일러를 추가하면 람다 내부에 return 문을 추가해야합니다. 그러나 나는 사람의 물건을 돌려 주어야한다. – nwGCham

답변

6

RowMapper은 하나의 추상 메소드 (Object의 메소드를 상속하지 않음)가있는 인터페이스이므로 it can be considered a functional interface입니다. 함수 메서드는 ResultSetint이며 개체를 반환합니다.

코드의 첫 번째 문제점은 리턴 된 오브젝트 유형이 인터페이스의 제네릭 유형이라는 것입니다. 현재 RowMapper과 함께 사용되는 경우 원시 유형 which you shouldn't do을 사용하고 있습니다. 두 번째 문제는 람다식이 어떤 개체도 반환하지 않으므로 반환 할 개체를 제외한 함수 메서드를 따를 수 없다는 것입니다.

이와 같이, 보정 코드가 될 것이다 :

RowMapper<Person> rowMapper = (rs, rowNum) -> { 
    Person p = new Person(); 
    p.setName(rs.getString("personName")); 
    p.setAddress(rs.getString("address")); 
    p.setAge(rs.getInt("age")); 
    return p; 
}; 
+0

코드를 컴파일 할 때 오류가 발생했습니다. 311 : 오류 : ')'예상 됨 RowMapper rowMapper = (rs, rowNum) -> { @Tunaki 이것으로 어떤 생각이 나니? – nwGCham

+0

아마 @Gayath 주위의 코드 때문일 것입니다. 전에 줄을보세요. 혼자서이 스 니펫을 취하면 잘 컴파일됩니다. – Tunaki

6

RowMapper의 람다 식 예를 사용 :

return jdbcTemplate.query(" select Scale_Point,Scale_Head from TEval_Scale ", new Object[] {}, 
       (resultSet, rowNum) ->{ 

        TEvalScale tEvalScale = new TEvalScale(); 
        tEvalScale.setScalePoint(resultSet.getInt("Scale_Point")); 
        tEvalScale.setScaleHead(resultSet.getString("Scale_Head")); 
        return tEvalScale; 

       });