我有一个用户实体:
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/