Hat Spring Data JPA eine Möglichkeit, Entites mithilfe der Auflösung von Methodennamen zu zählen?


125

Spring Data JPA unterstützt das Zählen von Entitäten mithilfe von Spezifikationen. Aber gibt es eine Möglichkeit, Entitäten mithilfe der Auflösung von Methodennamen zu zählen? Angenommen, ich möchte, dass eine Methode countByNameEntitäten mit einem bestimmten Namen zählt, genau wie eine Methode findByName, um alle Entitäten mit einem bestimmten Namen abzurufen.


6
Bitte akzeptieren Sie eine der Antworten, YaoFeng. Ich habe Spring Data JPA 1.5.2 getestet und die countByName () -Syntax funktioniert als Abel-Notizen.
nullPainter

Antworten:


213

Ab Spring Data 1.7.1.RELEASE können Sie dies auf zwei verschiedene Arten tun:

1) Die neue Methode , bei der die Abfrage sowohl zum Zählen als auch zum Löschen von Abfragen verwendet wird. Lesen Sie dies (Beispiel 5). Beispiel,

public interface UserRepository extends CrudRepository<User, Integer> {
    Long countByName(String name);
}

2) Der alte Weg , @Query-Annotation verwenden.
Beispiel,

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
    Long aMethodNameOrSomething(String name);
}

oder auch mit @Param Annotation,

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
    Long aMethodNameOrSomething(@Param("name") String name);
}

Überprüfen Sie auch dies, also antworten Sie .


3
Was ist mit anderen Aggregatfunktionen wie Summe, Durchschnitt?
lrkwz

Die Frage betraf die Zählfunktion, nicht die Summe oder den Durchschnitt. Federdaten unterstützen so etwas wie den "neuen Weg" für diese Funktionen noch nicht. Man könnte so etwas wie verwenden diese
George Siggouroglou

1
In Ihrem zweiten und dritten Beispiel müssten Sie "SELECT COUNT (u) ..." verwenden, da dies eine Zählabfrage sein soll.
TheChrisPratt

Danke für deinen Kommentar. Es war mein Fehler.
George Siggouroglou

Nicht zu wroren, fand es - commons-lang
NickJ

19

Solange Sie die Version 1.4 nicht verwenden, können Sie explizite Anmerkungen verwenden:

Beispiel:

@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);

3
beachten Sie, dass die Methode zurückgeben soll longstatt int, sonst werden Sie eine Classcast ohne Hinweise erhalten
Rangi Lin

13

JpaRepository erweitert auch QueryByExampleExecutor. Sie müssen also nicht einmal benutzerdefinierte Methoden auf Ihrer Benutzeroberfläche definieren:

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}

Und dann fragen Sie wie:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));

Diese Version gefällt mir am besten - vor allem, weil ich keine Ahnung hatte, wie das laut Doku funktionieren soll :-) Du hast meinen Tag gerettet :-) Als Bemerkung: Primitive (zB int) sind in der Expamle-Suche enthalten, dh int agewird zwar nicht festgelegt, aber Integer ageaus der Stichprobe ausgeschlossen (zumindest in Eclipselink)
LeO

Genau das habe ich gesucht. Danke dir!
Emrekgn


8

Arbeitsbeispiel

@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
    List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
    long countByTenantName(String tenantName);
}

Anruf von der DAO-Schicht

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}

5

Laut Abel ist nach der Version 1.4 (getestet in Version 1.4.3.RELEASE) dies folgendermaßen möglich:

public long countByName (String name);



2

Danke euch allen! Jetzt ist es Arbeit. DATAJPA-231

Es wird schön sein, wenn es möglich wäre, eine Zählung zu erstellen ... nach ... Methoden wie finden ... nach Einsen. Beispiel:

public interface UserRepository extends JpaRepository<User, Long> {

   public Long /*or BigInteger */ countByActiveTrue();
}


1

Ich habe erst seit ein paar Wochen damit gearbeitet, aber ich glaube nicht, dass dies unbedingt möglich ist, aber Sie sollten in der Lage sein, den gleichen Effekt mit etwas mehr Aufwand zu erzielen. Schreiben Sie die Abfrage einfach selbst und kommentieren Sie den Methodennamen. Es ist wahrscheinlich nicht viel einfacher als die Methode selbst zu schreiben, aber meiner Meinung nach ist es sauberer.

Bearbeiten: es ist jetzt nach DATAJPA-231 möglich


0
@Autowired
private UserRepository userRepository;

@RequestMapping("/user/count")
private Long getNumberOfUsers(){
    return userRepository.count();
}

1
Dieses Beispiel ist nicht zum Thema. Der Benutzer fragte, wie der Feldname gezählt werden soll und nicht, wie die Basiszählung von einem REST-Service aufgerufen werden soll.
Jad B.

0

Wenn jemand die Anzahl anhand mehrerer Bedingungen ermitteln möchte, finden Sie hier eine benutzerdefinierte Beispielabfrage

@Query("select count(sl) from SlUrl sl where sl.user =?1 And sl.creationDate between ?2 And ?3")
    long countUrlsBetweenDates(User user, Date date1, Date date2);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.