Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement RowMapper using java lambda expression

I had a working RowMapper code that maps database table row in to a java object. I wanted to change the implementation using lambda expression. However, I am always getting error; Code snippet as follows;

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;

Can someone help me to implement code correctly? Any idea to get list of persons?

like image 813
nwGCham Avatar asked Jan 29 '17 16:01

nwGCham


3 Answers

RowMapper is a interface with a single abstract method (not inheriting from a method of Object), so it can be considered a functional interface. Its functional method takes a ResultSet and a int, and returns an object.

The first problem with the code is that the type of the object returned is a generic type of the interface. As currently used with RowMapper, you're using a raw-type, which you shouldn't do. The second issue is that the lambda expression does not return any object, so it cannot conform to the functional method which except an object to be returned.

As such, a corrected code would be:

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;
};
like image 62
Tunaki Avatar answered Oct 24 '22 06:10

Tunaki


RowMapper using lambda expression example:

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;

                });
like image 34
Ferdous Wahid Avatar answered Oct 24 '22 08:10

Ferdous Wahid


@Tunaki is correct. Here is the shorthand version:

RowMapper<Person> rowMapper = (rs, rowNum) -> new Person(rs.getString("personName"), rs.getString("address"),rs.getInt("age")) ;

The brackets and the return aren't needed as they are implied.

like image 4
NuAlphaMan Avatar answered Oct 24 '22 08:10

NuAlphaMan