it-swarm.com.ru

Я не могу использовать метод findOne () в моем коде

У меня ошибка в приложении, потому что я использую метод findOne (). Ниже мой простой код. В классе User мой идентификатор - это String email, и я пытаюсь использовать его в своем классе UserService следующим образом: 

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

но у меня есть эта ошибка:

метод findOne в интерфейсе org.springframework.data.repository.query.QueryByExampleExecutor нельзя применить к данным типам;
требуется: org.springframework.data.domain.Example
найдено: Java.lang.String
причина: невозможно определить переменную типа (ов) 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;
}

и UserRepository:

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

Используйте findById или getOne вместо findOne , когда вы хотите искать только по 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
    }
}

Функция 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); 
8
Jose Da Silva

Метод findOne в JpaRepository определяется как: 

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

Ссылка

и вы передаете строку в качестве параметра. Если вы хотите найти с помощью User.email, метод должен быть определен как:

User findOneByEmail (String email);

Этот механизм объясняется в документ создания запроса

4
lucsbelt

У меня было что-то подобное. Это потому, что вы используете более новую версию.

Вы можете это исправить: 

return userRepository.findById(email).orElse(null);
0
Mathias Skovgaard Skovgaard