gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:13 25 4
gpt4 key购买 nike

我有一个用户实体:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com