Spring Data JPAondersteunt het tellen van entiteiten specificaties gebruiken. Maar heeft het een manier om entiteiten te tellen met behulp van methodenaamomzetting? Laten we zeggen dat ik een methode countByName
wil om entiteiten met een specifieke naam te tellen, net als een methode findByName
om alle entiteiten met een specifieke naam op te halen.
Antwoord 1, autoriteit 100%
Vanaf Spring Data 1.7.1.RELEASEkunt u dit op twee verschillende manieren doen,
- De nieuwe manier, waarbij query-afleiding wordt gebruikt voor zowel telling- als verwijderquery’s. Lees dit, ( Voorbeeld 5).
Voorbeeld,
public interface UserRepository extends CrudRepository<User, Integer> {
long countByName(String name);
}
- De oude manier, met
@Query
annotatie.
Voorbeeld,
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
long aMethodNameOrSomething(String name);
}
of gebruik ook de annotatie @Param
,
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
long aMethodNameOrSomething(@Param("name") String name);
}
Controleer ook dit dus antwoord.
Antwoord 2, autoriteit 11%
Zolang u versie 1.4 niet gebruikt, kunt u expliciete annotaties gebruiken:
voorbeeld:
@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
Antwoord 3, autoriteit 7%
JpaRepository breidt ook QueryByExampleExecutor uit. U hoeft dus niet eens aangepaste methoden op uw interface te definiëren:
public interface UserRepository extends JpaRepository<User, Long> {
// no need of custom method
}
En dan een zoekopdracht als:
User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
Antwoord 4, autoriteit 5%
Werkvoorbeeld
@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
long countByTenantName(String tenantName);
}
Bellen vanuit DAO-laag
@Override
public long countByTenantName(String tenantName) {
return repository.countByTenantName(tenantName);
}
Antwoord 5, autoriteit 4%
Deze functie is toegevoegd in versie 1.4 M1
Antwoord 6, autoriteit 2%
Blijkbaar is het nu geïmplementeerd DATAJPA-231
Antwoord 7, autoriteit 2%
Volgens Abel is het na versie 1.4 (getest in versie 1.4.3.RELEASE) op deze manier mogelijk:
public long countByName(String name);
Antwoord 8
Bedankt allemaal! Nu is het werk. DATAJPA-231
Het zou leuk zijn als het mogelijk was om count…by… methodes te maken, net als find…by ones. Voorbeeld:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
Antwoord 9
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
Antwoord 10
Volgens het probleem DATAJPA-231is de functie nog niet geïmplementeerd.
Antwoord 11
Ik werk er pas een paar weken mee, maar ik geloof niet dat dit strikt mogelijk is, maar je zou met wat meer moeite hetzelfde effect moeten kunnen krijgen; schrijf gewoon de query zelf en annoteer de naam van de methode. Het is waarschijnlijk niet veel eenvoudiger dan de methode zelf te schrijven, maar het is naar mijn mening schoner.
Bewerken: het is nu mogelijk volgens DATAJPA-231
Antwoord 12
Als iemand de telling wil hebben op basis van meerdere voorwaarden, dan is hier een voorbeeld van een aangepaste zoekopdracht
@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);