从控制器|中的结果集中排除列 Spring数据jpa

chr*_*con 7 java spring hibernate jpa spring-mvc

我有一个用户实体:

public class SpringUsers implements Serializable {
    private String password;
    // other fields omitted
    @Basic
    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
Run Code Online (Sandbox Code Playgroud)

及其存储库:

public interface SpringUsersRepository extends CrudRepository<SpringUsers, Integer> {
    SpringUsers findByUsername(String username);
    List<SpringUsers> findByUserId(Integer userId);
}
Run Code Online (Sandbox Code Playgroud)

我有一个控制器方法,应该获得与当前经过身份验证的用户具有相同userId(内部使用)的所有注册用户的列表:

public List<SpringUsers> getRegisteredUsers() {
    CustomUserDetails authenticatedUserDetails = getCustomUserDetails();
    List<SpringUsers> registered = springUsersRepository.findByUserId(
        authenticatedUserDetails.getUserMyId());
    return registered.stream().map(v -> {
        v.setPassword(null);
        return v;
    }).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

我不想将密码(即使它是加密的)传递给前端 - 所以我流过用户并将密码设置为null,如上所示.

但是,我想知道是否有可能首先不在查询结果中包含用户的密码?


版本信息:

Spring boot 1.4.0和Hibernate 5.0.9.Final

Ali*_*ani 9

您可以使用@Query选择性地包含一些字段:

// Include all fields you wanna query for using u.x syntax
// AFAIK there is no exclusion syntatic sugar
@Query("select u.id, u.username from SpringUsers u where u.id = ?1")
List<SpringUsers> findByUserId(Integer userId);
Run Code Online (Sandbox Code Playgroud)

您也可以使用预测.首先通过引入投影界面来定义投影:

interface NoPasswordUser {
    Long getId();
    String getUsername();
    // Do not include getPassword();
}
Run Code Online (Sandbox Code Playgroud)

然后在您的存储库中使用它:

public interface SpringUsersRepository extends CrudRepository<SpringUsers, Integer> {
    NoPasswordUser findByUsername(String username);
    List<NoPasswordUser> findByUserId(Integer userId);
}
Run Code Online (Sandbox Code Playgroud)

无论如何,最好不要通过REST或任何远程接口公开您的实体.你可以使用DTO,这篇文章可能在这方面很有用.

  • 是的,预测似乎是一种方式---如果我找不到另一种解决方案,我会这样做.谢谢你的提示! (2认同)

Val*_*mar 7

使用@JsonIgnore,这将使其在后面可用,但转换为json时不会返回

@Size(min = 8)
@JsonIgnore
private String password;
Run Code Online (Sandbox Code Playgroud)