我有一个班级用户,具有以下字段:
private Long id;
private String u_name;
private String u_surname;
private int u_age;
private Set<Roles> roles = new HashSet<>(); //its enum
当我尝试使用JdbcTemplate和rest控制器显示它作为响应时,我遇到了一个问题,因为我在其中收到了三个对象。
我的存储库类:
public List<User> findAll() {
String sql = "select users.id, users.u_name, users.u_surname, users.u_age, user_roles.user_role from users inner join user_roles on users.id = user_roles.user_id";
return jdbc.query(sql, new RowMapper<User>(){
@Override
public User mapRow(ResultSet rs, int row) throws SQLException {
Set<Roles> roles = new HashSet<>();
roles.add(Roles.valueOf(rs.getString("user_role")));
return new User(rs.getLong("id"), rs.getString("u_name"), rs.getString("u_surname"), rs.getInt("u_age"), roles);
}
});
}
public User findById(Long id) {
String sql = "select users.id, users.u_name, users.u_surname, users.u_age, user_roles.user_role from users inner join user_roles on users.id = user_roles.user_id where users.id = ?";
return jdbc.queryForObject(sql, new RowMapper<User>(){
@Override
public User mapRow(ResultSet rs, int row) throws SQLException {
Set<Roles> roles = new HashSet<>();
roles.add(Roles.valueOf(rs.getString("user_role")));
return new User(rs.getLong("id"), rs.getString("u_name"), rs.getString("u_surname"), rs.getInt("u_age"), roles);
}
}, id);
}
我只需要接收一个对象而不要接收许多对象,该怎么办?
之所以这样,是因为您可能附加了一个以上角色给您的用户,因此您的SQL将产生一个矩阵(更多角色,更多行),以解决您将不得不删除该联接的情况,但前提是您不这样做。不需要看角色。但是,如果必须检索具有角色的用户,则可以将sql更改为使用“ exists”,如下所示:
select
users.id,
users.u_name,
users.u_surname,
users.u_age,
user_roles.user_role
from users
where exists (
select 1 from user_roles
where users.id = user_roles.user_id)
and users.id = ?
*尚未测试