web-dev-qa-db-fra.com

Spring Data JPA permet-il de compter les entités à l'aide de la résolution du nom de méthode?

Spring Data JPA prend en charge le comptage des entités à l'aide de spécifications. Mais existe-t-il un moyen de compter les entités en utilisant la résolution du nom de méthode? Disons que je veux une méthode countByName pour compter les entités avec un nom spécifique, tout comme une méthode findByName pour récupérer toutes les entités avec un nom spécifique.

88
YaoFeng

À partir de Spring Data 1.7.1.RELEASE, vous pouvez le faire de deux manières différentes. 

1) Le nouvelle façon, utilisant la dérivation de requête pour les requêtes de comptage et de suppression Lisez this , (Exemple 5) . Exemple, 

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

2) Le ancienne méthode, Utilisation de l'annotation @Query.
Exemple, 

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

ou en utilisant l'annotation @Param également, 

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

Vérifiez aussi ceci afin de répondre .

146
George Siggouroglou

Tant que vous n'utilisez pas la version 1.4, vous pouvez utiliser une annotation explicite:

exemple:

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

Cette fonctionnalité a été ajoutée à la version 1.4 M1

10
Abel Pastur

JpaRepository étend également QueryByExampleExecutor. Donc, vous n'avez même pas besoin de définir des méthodes personnalisées sur votre interface:

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

Et puis requête comme:

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

Selon Abel, après la version 1.4 (testée dans la version 1.4.3.LELEASE), il est possible de procéder ainsi:

public long countByName (nom de chaîne);

5
Marcos Nunes

Apparemment, il est implémenté maintenant DATAJPA-231

4
chpopov

Exemple de travail 

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

Appel de la couche DAO

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

Merci à tous! Maintenant c'est du travail. DATAJPA-231

Ce sera bien s'il était possible de créer compte… Par… méthodes comme trouver… par personnes Exemple:

public interface UserRepository extends JpaRepository<User, Long> {

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

Selon le problème DATAJPA-231 , la fonctionnalité n'est pas encore implémentée.

1
@Autowired
private UserRepository userRepository;

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

Je ne travaille avec ce logiciel que depuis quelques semaines, mais je ne pense pas que cela soit strictement possible, mais vous devriez pouvoir obtenir le même effet avec un peu plus d'effort. écrivez simplement la requête et annotez le nom de la méthode. Ce n'est probablement pas beaucoup plus simple que d'écrire la méthode vous-même mais elle est plus propre à mon avis.

0
Thevenin