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

时间:2016-09-02 14:19:52

标签: java spring hibernate spring-mvc jpa

我有一个用户实体:

films

及其存储库:

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

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

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

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

但是,我想知道是否有可能不包括用户&#39;查询结果中的密码首先出现在哪里?

版本信息:

Spring boot 1.4.0&amp; Hibernate 5.0.9.Final

4 个答案:

答案 0 :(得分:7)

您可以使用@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 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或任何远程接口公开您的实体。你可以使用DTO,这个post可能在这方面很有用。

答案 1 :(得分:2)

我不认为有一种方法可以在从db获取实体时忽略某些字段,因为这些实体不会处于一致状态 - 它们的数据与数据库中的数据不同。但是存在其他选项(自定义查询,投影)。

一种选择是使用constructor expressions并在查询中直接填充一些POJO

select new my.company.SafeUser(u.username, u.email) from User u

无论如何,我认为您应该将DTO发送到前端,并在其中公开您在前端需要的属性。这种方法有很多优点,如上例所示,或者在结果循环中初始化它们的天气。

答案 2 :(得分:2)

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

@Size(min = 8)
@JsonIgnore
private String password;

答案 3 :(得分:0)

排除密码写入json并保持读取的最佳方法是Jackson注解:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

类似,注册日期:

@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Date registered = new Date();

Jackson @JsonProperty examples