I can't use findOne() method in my code

2019-04-08 23:17发布

I have error in my app, because I use findOne() method. Below my simple code. In User class my id is String email and that's id I'm trying to use in my class UserService like this :

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

but I have this error:

method findOne in interface org.springframework.data.repository.query.QueryByExampleExecutor cannot be applied to given types;
required: org.springframework.data.domain.Example
found: java.lang.String
reason: cannot infer type-variable(s) S (argument mismatch; java.lang.String cannot be converted to org.springframework.data.domain.Example)

User class:

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

and UserRepository:

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

3条回答
做自己的国王
2楼-- · 2019-04-08 23:59

The method findOne in JpaRepository are defined as:

<S extends T> Optional<S> findOne(Example<S> example)

Reference

and yo are passing a String as parameter. If you want to find by User.email the method has to be defined as:

User findOneByEmail (String email);

This mecanism is explained in query creation document

查看更多
Rolldiameter
3楼-- · 2019-04-09 00:00

I had something like it. Its because you are using a newer version.

You can fix it by:

return userRepository.findById(email).orElse(null);
查看更多
三岁会撩人
4楼-- · 2019-04-09 00:03

Use findById or getOne instead of findOne when you want to search only by id.

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

The function findOne() receives a Example<S>, this method is used to find by example, so you need to provide the example object and the fields to check.

You can find how to use the find by example.

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

But it is basically something like.

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

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

Example<User> example = Example.of(user, matcher); 
查看更多
登录 后发表回答