Ich habe einen Fehler in meiner App, weil ich die findOne () -Methode verwende. Unter meinem einfachen Code. In der Benutzerklasse lautet meine ID String-E-Mail. Diese ID versuche ich in meiner Klasse UserService wie folgt zu verwenden:
public User findUser(String email){
return userRepository.findOne(email);
}
aber ich habe diesen fehler:
methode findOne in der Schnittstelle org.springframework.data.repository.query.QueryByExampleExecutor kann nicht auf angegebene Typen angewendet werden.
Erforderlich: org.springframework.data.domain.Example
gefunden: Java.lang.String
Grund: Typvariable (n) S .__ kann nicht abgeleitet werden. (Argument stimmt nicht überein; Java.lang.String kann nicht in org.springframework.data.domain.Example konvertiert werden)
Benutzerklasse:
@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;
}
und UserRepository:
public interface UserRepository extends JpaRepository<User, String> {
}
Verwenden Sie findById oder getOne anstelle von findOne , wenn Sie nur nach ID suchen möchten.
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
}
}
Die Funktion findOne()
empfängt einen Example<S>
. Diese Methode wird zur Suche anhand von Beispielen verwendet. Sie müssen also das Beispielobjekt und die zu überprüfenden Felder angeben.
Sie können die Suche anhand des Beispiels finden.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.matchers
Aber es ist im Grunde so etwas.
User user = new User();
person.setName("Dave");
ExampleMatcher matcher = ExampleMatcher.matching()
.withIgnorePaths("name")
.withIncludeNullValues()
.withStringMatcherEnding();
Example<User> example = Example.of(user, matcher);
Die Methode findOne in JpaRepository ist definiert als:
<S extends T> Optional<S> findOne(Example<S> example)
und yo übergeben einen String als Parameter. Wenn Sie mit User.email suchen möchten, muss die Methode folgendermaßen definiert werden:
User findOneByEmail (String email);
Dieser Mechanismus wird in Abfrageerstellungsdokument erläutert.
Ich hatte so etwas. Es ist, weil Sie eine neuere Version verwenden.
Sie können es beheben durch:
return userRepository.findById(email).orElse(null);