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.
À 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 .
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);
Cette fonctionnalité a été ajoutée à la version 1.4 M1
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));
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);
Apparemment, il est implémenté maintenant DATAJPA-231
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);
}
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();
}
Selon le problème DATAJPA-231 , la fonctionnalité n'est pas encore implémentée.
@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.