Ich weiß bisher nur, dass FindBy mehrere Ergebnisse zurückgeben kann, während FindOneBy ein einzelnes Ergebnis oder null zurückgibt, wenn wir es auf folgende Weise verwenden.
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
jetzt, meine Frage ist, kann ich findBy auf diese Weise verwenden?
Department findByDepartmentId(Long Id);
Falls ja,
Schließlich, Wann oder Warum sollte ich findBy nicht anstelle von findOneBy verwenden?
Kann ich
findBy
auf diese Weise verwenden? AbteilungfindByDepartmentId(Long Id)
;
Ja, diese Syntax ist aus Spring-JPA-Sicht technisch korrekt. Spring JPA legt zwar fest, was Sie mit Ihrer Abfrage erreichen möchten, indem Sie auch den return-Typ betrachten.
Grundsätzlich sind dies die Fälle für Rückgabetypen:
mit Ihrer Abfrage möchten Sie einen einzelnen Wert zurückgeben. Sie können basic type
, Entity T
, Optional<T>
, CompletableFuture<T>
usw. angeben.
mit Ihrer Abfrage möchten Sie eine Sammlung von T zurückgeben. Sie können List<T>
, Stream<T>
, Page<T>
, Slice<T>
usw.
Davon abgesehen, Ihre Abfragedefinition:
Department findByDepartmentId(Long Id);
bedeutet, dass Sie ein einzelnes Ergebnis erwarten (weil Sie eine einzelne Entität als Rückgabetyp angegeben haben). Dies wird sich darauf beziehen, wie Spring JPA die Abfrage ausführt. Sie ruft getSingleResult()
in der javax.persistence.Query
-Schnittstelle auf, die eine exception
auslöst, wenn mehrere Objekte die Kriterien erfüllen.
Auf welcher Basis gibt
findBydepartmentId
einen einzelnen Datensatz zurück?
Auf der Grundlage, dass es ein einzelnes Objekt mit dieser ID gibt, wird ansonsten eine Ausnahme ausgelöst.
Wann oder warum sollte ich
findBy
nicht anstelle vonfindOneBy
verwenden?
Diese beiden haben unterschiedliche Bedeutungen und sind nicht austauschbar.
findOneBy
führt immer dazu, dass getSingleResult()
aufgerufen wird.
findBy
verhält sich je nach Rückgabetyp unterschiedlich - wie in den oben angegebenen Definitionen.
findOneByXX
sorgt dafür, dass es nur einen oder keinen Wert gibt. Bei 2 Werten wird eine Ausnahme ausgelöst.
findByXX
macht diese Prüfung der Eindeutigkeit jedoch nicht.