java - 从 Controller 中的结果集中排除列 | Spring 数据jpa

标签 java spring hibernate spring-mvc jpa

我有一个用户实体:

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

及其存储库:

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

我有一个 Controller 方法,它应该获取与当前经过身份验证的用户具有相同 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());
}

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

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


版本信息:

Spring Boot 1.4.0 & hibernate 5.0.9.Final

最佳答案

您可以使用@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);

您也可以使用 Projections .首先通过引入投影接口(interface)来定义投影:

interface NoPasswordUser {
    Long getId();
    String getUsername();
    // Do not include getPassword();
}

然后在你的仓库中使用它:

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

无论如何,最好不要通过 REST 或任何远程接口(interface)公开您的实体。您可以为此使用 DTO,这 post可能在这方面有用。

关于java - 从 Controller 中的结果集中排除列 | Spring 数据jpa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39294654/

相关文章:

java - 如何在Java中初始化图形?

spring - 如何在没有XML文件的情况下配置Spring ACL

spring - 在命令行中运行 Spring 应用程序时出现无法识别的 xbean 命名空间映射异常

java - 组织.hibernate.exception.SQLGrammarException : Table 'XXX' doesn't exist

mysql - 恩弗斯 : auto_increment (not PK) column not being audited

Java Applet,重绘 60 次/秒方法和多边形

恰好匹配 8 位数字的 Java RegEx

Java Swing 窗口未出现在 Eclipse 中

java - Hibernate 返回 BigIntegers 而不是 longs

hibernate - GORM createCriteria或带有别名的语句