データベーステーブル行を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;
誰かがコードを正しく実装するのを手伝ってくれますか?人のリストを取得するためのアイデアはありますか?
RowMapper
は、1つの抽象メソッド(Object
のメソッドを継承しない)を持つインターフェイスなので、 機能的なインターフェイスと見なすことができます =。その機能メソッドは、ResultSet
とint
を取り、オブジェクトを返します。
コードの最初の問題は、返されるオブジェクトの型がインターフェイスのジェネリック型であることです。現在RowMapper
で使用されているように、rawタイプ これはすべきではありません を使用しています。 2番目の問題は、ラムダ式がオブジェクトを返さないため、返されるオブジェクト以外の機能メソッドに準拠できないことです。
そのため、修正されたコードは次のようになります。
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;
};
ラムダ式の例を使用した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;
});
@Tunakiは正しいです。略記版は次のとおりです。
RowMapper<Person> rowMapper = (rs, rowNum) -> new Person(rs.getString("personName"), rs.getString("address"),rs.getInt("age")) ;
かっこと戻り値は暗示されているため、必要ありません。
@Tunakiの回答に加えて。
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;
};
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("person_id", personId);
単一のPersonを取得する場合:
Person person = getJdbcTemplate().queryForObject(queryString, paramMap, rowMapper);
List of Personを取得する場合:
List<Person> personList = getJdbcTemplate().query(queryString, paramMap, rowMapper);