Spring boot 如何在使用findBy时忽略提取的特定列。。在JPA中

Spring boot 如何在使用findBy时忽略提取的特定列。。在JPA中,spring-boot,spring-data-jpa,spring-data,Spring Boot,Spring Data Jpa,Spring Data,我有一个User实体,其中包含所有用户数据,包括密码散列。我还有一个APIgetUserDetails,它执行一个简单的userRepository.findById(id)来获取用户的所有数据。但是,在这个过程中,它还返回我不想返回的密码散列 移除密码散列的一种方法是在获取所有数据后将其从服务层移除。像这样- fun getUserDetails(id: Long): Optional<User> { val user: Optional<User> =

我有一个
User
实体,其中包含所有用户数据,包括密码散列。我还有一个API
getUserDetails
,它执行一个简单的
userRepository.findById(id)
来获取用户的所有数据。但是,在这个过程中,它还返回我不想返回的密码散列

移除密码散列的一种方法是在获取所有数据后将其从服务层移除。像这样-

fun getUserDetails(id: Long): Optional<User> {
        val user: Optional<User> = userRepository.findById(id)
        user.get().password = ""
        return user
    }
{
  "id": 4,
  "roles": "ADMIN",
  "userName": "user3",
  "emailId": "hello@outlook.com",
  "password": "",
  "phoneNumber": "1234",
  "organisationName": "test",
  "isActive": true
}
密码值已删除,但密钥仍然存在。我也想把它处理掉


有没有其他更适合JPA的方法可以用来实现上述结果?

您可以添加名为DTO的新层,并使用著名的库
modelmapper

将此添加到pom.xml中

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.3.5</version>
</dependency>
然后创建类UserDto作为示例

public class UserDto { 
 private Long id;
    String username;
    // standard getters and setters

    private UserDto convertToDto(User user) {
        UserDto userDto = modelMapper.map(user, UserDto);
        return userDto;
    }

}
在控制器或服务中

return convertToDto(userRepository.findById(id)); // wil return userDto

希望有用。

您可以添加名为DTO的新层,并使用著名的库
modelmapper

将此添加到pom.xml中

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.3.5</version>
</dependency>
然后创建类UserDto作为示例

public class UserDto { 
 private Long id;
    String username;
    // standard getters and setters

    private UserDto convertToDto(User user) {
        UserDto userDto = modelMapper.map(user, UserDto);
        return userDto;
    }

}
在控制器或服务中

return convertToDto(userRepository.findById(id)); // wil return userDto

希望有用。

在字段上使用
@get:JsonIgnore
跳过响应中的序列化


显然,您不需要在响应中发送密码散列。您需要在服务中使用密码,它在给出序列化响应时被忽略。

在字段上使用
@get:JsonIgnore
跳过响应中该密码的序列化


显然,您不需要在响应中发送密码散列。您在服务中需要密码,它只是在给出序列化响应时被忽略。

但这不会在所有查询中忽略它吗?那我什么时候真的需要大麻呢?这很有效。请把这个作为一个答案,我会把它标记为正确的。但这不会忽略所有的疑问吗?那我什么时候真的需要大麻呢?这很有效。请把这个作为答案,我会把它标对的。我面临一个问题。我的
POST
请求(添加用户)失败,因为在保存数据时密码字段也被忽略。工作,我面临一个问题。我的
POST
请求(添加用户)失败,因为在保存数据时密码字段也被忽略。作品