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> {
}
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);
_
JpaRepositoryのメソッドfindOneは次のように定義されます。
<S extends T> Optional<S> findOne(Example<S> example)
とyoはパラメータとして文字列を渡します。 User.emailで検索する場合は、メソッドを次のように定義する必要があります。
User findOneByEmail (String email);
このメカニズムは クエリ作成ドキュメント で説明されています
そのようなものがありました。新しいバージョンを使用しているためです。
次の方法で修正できます。
return userRepository.findById(email).orElse(null);