Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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> {
}
like image 925
mattt Avatar asked Mar 11 '18 19:03

mattt


2 Answers

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); 
like image 85
Jose Da Silva Avatar answered Sep 20 '22 19:09

Jose Da Silva


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

You can fix it by:

return userRepository.findById(email).orElse(null);
like image 21
Skovgaard Avatar answered Sep 17 '22 19:09

Skovgaard