2017-01-29 2 views
3

Ich hatte einen funktionierenden RowMapper-Code, der Datenbanktabellenzeile in einem Java-Objekt abbildet. Ich wollte die Implementierung mit Lambda-Ausdruck ändern. Allerdings bekomme ich immer Fehler. Code-Snippet wie folgt;Wie RowMapper mit Java Lambda-Ausdruck implementieren

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; 

Kann mir jemand helfen, den Code korrekt zu implementieren? Irgendeine Idee, Liste der Personen zu bekommen?

+0

Was ist der Übersetzungsfehler. Hast du ein Semikolon nach '}'? Ist RowMapper eine funktionale Schnittstelle? Welche Federversion verwendest du? – CKing

+0

Ja, sobald ich den Semikolon-Compiler hinzugefügt habe, um eine Return-Anweisung in das Lambda einzufügen. Ich muss jedoch Person Objekt zurückgeben. – nwGCham

Antwort

6

RowMapper ist eine Schnittstelle mit einer einzigen abstrakten Methode (nicht erben von einer Methode Object), also it can be considered a functional interface. Seine funktionale Methode nimmt eine ResultSet und eine int und gibt ein Objekt zurück.

Das erste Problem mit dem Code ist, dass der Typ des zurückgegebenen Objekts ein generischer Typ der Schnittstelle ist. Wie derzeit mit RowMapper verwendet, verwenden Sie einen Rohtyp, which you shouldn't do. Das zweite Problem ist, dass der Lambda-Ausdruck kein Objekt zurückgibt, so dass er nicht der funktionalen Methode entsprechen kann, die ein Objekt zurückgibt.

Als solches wird ein korrigierter Code wäre:

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

Ich habe einen Fehler, wenn ich den Code kompiliere. 311: Fehler: ')' erwartet RowMapper rowMapper = (rs, rowNum) -> { @Tunaki eine Idee, mit diesem ... ?? – nwGCham

+0

Wahrscheinlich wegen Code um das @ Gayath. Schauen Sie sich die Zeilen vorher an. Wenn Sie das Snippet nur in dieser Antwort verwenden, wird es korrekt kompiliert. – Tunaki

6

RowMapper Lambda-Ausdruck am Beispiel:

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; 

       }); 
Verwandte Themen