Spring Data JPA-Unterschied zwischen findBy / findAllBy

73

Gibt es einen Unterschied bei der Verwendung von Spring Data JPA-Schlüsselwörtern zwischen:

List<SomeEntity> findBySomeCondition();

und

List<SomeEntity> findAllBySomeCondition();
Nikita
quelle

Antworten:

132

Nein, es gibt keinen Unterschied zwischen ihnen. Sie führen genau dieselbe Abfrage aus. Der AllTeil wird von Spring Data ignoriert, wenn die Abfrage aus dem Methodennamen abgeleitet wird. Das einzig wichtige Bit ist das BySchlüsselwort. Alles, was darauf folgt, wird als Feldname behandelt (mit Ausnahme anderer Schlüsselwörter, OrderBydie im Übrigen zu seltsam aussehenden Methodennamen führen können findAllByOrderByIdAsc).

Dies bedeutet, dass so etwas vollkommen gültig ist:

List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();

Und führt genau die gleiche SQL-Abfrage aus wie:

List<SomeEntity> findBySomeCondition();

oder

List<SomeEntity> findAllBySomeCondition();

In der Dokumentation zur Version 2.3.6 von Spring Data wird diese Funktion erläutert:

Jeder Text zwischen find(oder anderen einführenden Schlüsselwörtern) und Bywird als beschreibend angesehen, es sei denn, Sie verwenden eines der ergebnisbeschränkenden Schlüsselwörter, z. B. a Distinct, um ein eindeutiges Flag für die zu erstellende Abfrage zu setzen oder Top/ oder Firstum die Abfrageergebnisse einzuschränken.

Der Zweck der Funktion wurde in einem Blogbeitrag über die bevorstehende Version 2.0 von Spring Data erläutert :

Spring Data Methode Parsen Anwendungen Präfix Schlüsselwörter wie find, exists, count, und deleteund ein Abschluss ByStichwort. Alles, was Sie dazwischen legen findund ByIhren Methodennamen aussagekräftiger machen und die Ableitung von Abfragen nicht beeinflussen.

Robert Hunt
quelle
Vielen Dank für die Beschreibung
Nikita
Vielen Dank, dass Sie die OrderBy-Definition angegeben haben und zeigen, dass das By vor dem OrderBy erforderlich ist
Sylvester
Gibt es irgendwo eine VOLLSTÄNDIGE Dokumentation zur Erstellung von Abfragen (einschließlich Änderungen)? Ich kann nur Fragmente finden (zB docs.spring.io/spring-data/jpa/docs/current/reference/html/… - kein Wort über ..all .., entfernen ..)
Ekaterina
Warum ist es dann überhaupt dort?
Evghenii Orenciuc
Ich kann nicht das Präfix Name Verhalten in der Dokumentation entweder definiert finden, aber es gibt eine Sache , die wird das Verhalten ändern , wenn in dem Präfix enthalten: der Begriff „Distinct“, zB " findDistinctBySomeCondition(): . 4.4.2 Query - Erstellung
M. Justin
0

Ein Unterschied besteht darin, dass mit findAllBy Hibernate-Filter (@Filters from org.hibernate.annotations) angewendet werden und somit eine andere SQL.

Morik
quelle
-3

Die findBy-Methode wird verwendet, wenn wir nach Namen oder anderen Kriterien wie suchen möchten findByFirstName(String firstName);

findAll-Methoden finden im Allgemeinen durch Angabe einer Spezifikation

List<T> findAll(Specification<T> spec);

Weitere Informationen finden Sie in den folgenden Dokumenten:

http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html

shankarsh15
quelle
Nein, diese Methode, die Sie geschrieben haben, stammt von JPASpecificationExecutor. Ich spreche nur von JpaRepository. Ich kann die Methode findAllByFirstName (String firstName) erstellen und sie funktioniert ähnlich wie findByFirstName. In dieser Frage versuche ich, den Unterschied zwischen ihnen zu verstehen.
Nikita