webentwicklung-frage-antwort-db.com.de

Unterschied zwischen findBy und findOneBy in Spring data JPA

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,

  • Nehmen wir an, es gibt mehrere Datensätze für die angegebene ID.
  • Auf welcher Basis gibt findBydepartmentId einen einzelnen Datensatz zurück?

Schließlich, Wann oder Warum sollte ich findBy nicht anstelle von findOneBy verwenden?

11
Arun Gowda

Kann ich findBy auf diese Weise verwenden? Abteilung findByDepartmentId(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:

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 von findOneBy 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.

7
hovanessyan

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.

2