2017-01-29 21 views
3

我有一個工作的RowMapper代碼將數據庫表格行映射到java對象中。我想改變使用lambda表達式的實現。但是,我總是得到錯誤;代碼片段如下;如何使用java lambda表達式實現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

是的,一旦我添加了分號編譯器,要求在lambda中添加return語句。但是,我需要返回人物。 – nwGCham

回答

6

RowMapper是一個單一抽象方法的接口(不是從Object的方法繼承),所以it can be considered a functional interface。其功能方法需要一個ResultSet和一個int,並返回一個對象。

代碼的第一個問題是返回的對象的類型是接口的泛型類型。目前與RowMapper一起使用,您正在使用原始類型which you shouldn't do。第二個問題是,lambda表達式不返回任何對象,所以它不能符合除了要返回的對象之外的功能方法。

這樣,校正後的代碼將是:使用

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:error:')'expected RowMapper rowMapper =(rs,rowNum) - > { @Tunaki任何想法與此...? – nwGCham

+0

可能是由於圍繞@Gayath的代碼。看之前的行。如果你單獨採用這個答案,它編譯得很好。 – Tunaki

6

的RowMapper lambda表達式例如:

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; 

       });