我无法在我的代码中使用findOne()方法

我的应用程序中有错误,因为我使用findOne()方法。在我的简单代码下面。在用户类中,我的id是字符串电子邮件,这是我试图在我的类UserService中使用的id,如下所示:

public User findUser(String email){
    return userRepository.findOne(email);
}

但我有这个错误:

方法 findOne in interface org.springframework.data.repository.query.QueryByExampleExecutor 不能应用于给定的类型;
必需: org.springframework.data.domain.示例
已找到: java.lang.String
原因: 无法推断类型变量 (s) S (参数不匹配; java.lang.String 无法转换为 org.springframework.data.domain.example)

用户类:

@Entity
@Data
@Table(name = "User")
public class User {
    @Id
    @Email
    @NotEmpty
    @Column(unique = true)
    private String email;

    @NotEmpty
    private String name;

    @NotEmpty
    @Size(min = 5)
    private String password;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Task> tasks;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "USER_ROLE", joinColumns = {
        @JoinColumn(name = "USER_EMAIL", referencedColumnName = "email")
    }, inverseJoinColumns = {@JoinColumn(name = "ROLE_NAME", referencedColumnName = "name")})
    private List<Role> roles;
}

和用户存储库:

public interface UserRepository extends JpaRepository<User, String> {
}

答案 1

当您只想按 id 搜索时,请使用 findByIdgetOne 而不是 findOne

public User findUser(String email){
    return userRepository.getOne(email); // throws when not found or
                                         // eventually when accessing one of its properties
                                         // depending on the JPA implementation
}

public User findUser(String email){
    Optional<User> optUser = userRepository.findById(email); // returns java8 optional
    if (optUser.isPresent()) {
        return optUser.get();
    } else {
        // handle not found, return null or throw
    }
}

该函数接收一个 ,此方法用于通过示例进行查找,因此您需要提供示例对象和要检查的字段。findOne()Example<S>

您可以找到如何使用“查找依据”示例。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.matchers

但它基本上是类似的东西。

User user = new User();                          
person.setName("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
    .withIgnorePaths("name")                         
    .withIncludeNullValues()                             
    .withStringMatcherEnding();

Example<User> example = Example.of(user, matcher); 

答案 2

我有类似的东西。这是因为您使用的是较新版本。

您可以通过以下方式修复它:

return userRepository.findById(email).orElse(null);

推荐