当我在sql中使用内部联接comand时,如何使用spring JdbcTemplate接收一个对象,而不是许多对象?

问题描述 投票:0回答:1

我有一个班级用户,具有以下字段:

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);
}

我只需要接收一个对象而不要接收许多对象,该怎么办?

java spring spring-data jdbctemplate
1个回答
0
投票

之所以这样,是因为您可能附加了一个以上角色给您的用户,因此您的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 = ?

*尚未测试

© www.soinside.com 2019 - 2024. All rights reserved.