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.

YaoFeng
quelle
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 .

George Siggouroglou
quelle
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);
römisch
quelle
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));
L. Holanda
quelle
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
11

Diese Funktion wurde in Version 1.4 M1 hinzugefügt

Abel Pastur
quelle
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);
}
Sagar Misal
quelle
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);

Marcos Nunes
quelle
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();
}
Thanongsak Chamung
quelle
1

Gemäß dem Problem DATAJPA-231 ist die Funktion noch nicht implementiert.

Oleksandr Bondarenko
quelle
Jetzt ist es implementiert
Sergey Ponomarev
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

Mark Sholund
quelle
0
@Autowired
private UserRepository userRepository;

@RequestMapping("/user/count")
private Long getNumberOfUsers(){
    return userRepository.count();
}
Богдан Ляховецкий
quelle
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);
Inzimam Tariq IT
quelle