web-dev-qa-db-ja.com

コードでfindOne()メソッドを使用できません

FindOne()メソッドを使用しているため、アプリにエラーがあります。私の簡単なコードの下。 Userクラスでは、私のidはString emailであり、そのクラスのUserServiceで次のように使用しようとしています。

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

しかし、私はこのエラーがあります:

インターフェースorg.springframework.data.repository.query.QueryByExampleExecutorのメソッドfindOneは、指定されたタイプに適用できません。
必須:org.springframework.data.domain.Example
found:Java.lang.String
理由:type-variable(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;
}

およびUserRepository:

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

Idのみで検索する場合は、 findOne の代わりに findById または getOne を使用します。

_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); 
_
13
Jose Da Silva

JpaRepositoryのメソッドfindOneは次のように定義されます。

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

参照

とyoはパラメータとして文字列を渡します。 User.emailで検索する場合は、メソッドを次のように定義する必要があります。

User findOneByEmail (String email);

このメカニズムは クエリ作成ドキュメント で説明されています

4
lucsbelt

そのようなものがありました。新しいバージョンを使用しているためです。

次の方法で修正できます。

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