SpringData JPA 는 사양을 사용하여 엔티티 계산을 지원합니다. 그러나 메서드 이름 확인을 사용하여 엔터티를 계산하는 방법이 있습니까? countByName
특정 이름을 findByName
가진 모든 항목을 가져 오는 방법처럼 특정 이름을 가진 항목을 계산 하는 방법 을 원한다고 가정 해 보겠습니다 .
SpringData JPA 는 사양을 사용하여 엔티티 계산을 지원합니다. 그러나 메서드 이름 확인을 사용하여 엔터티를 계산하는 방법이 있습니까? countByName
특정 이름을 findByName
가진 모든 항목을 가져 오는 방법처럼 특정 이름을 가진 항목을 계산 하는 방법 을 원한다고 가정 해 보겠습니다 .
답변:
현재 봄 데이터 1.7.1.RELEASE 당신은 두 가지 방법으로 할 수 있습니다,
1) 쿼리 개수 및 삭제 쿼리 모두에 쿼리 파생을 사용 하는 새로운 방법 . 이것을 읽으십시오 (예제 5). 예,
public interface UserRepository extends CrudRepository<User, Integer> {
Long countByName(String name);
}
2) 이전 방식 , @Query 주석 사용.
예,
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
Long aMethodNameOrSomething(String name);
}
또는 @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);
}
또한 확인 이 너무 대답을 .
JpaRepository는 QueryByExampleExecutor도 확장합니다. 따라서 인터페이스에서 사용자 지정 메서드를 정의 할 필요도 없습니다.
public interface UserRepository extends JpaRepository<User, Long> {
// no need of custom method
}
그리고 다음과 같이 쿼리합니다.
User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
int age
설정되지는 않았지만 포함되지만 Integer age
샘플에서 제외됩니다 (적어도 Eclipselink에서)
이 기능은 버전 1.4 M1에 추가되었습니다.
작업 예
@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
long countByTenantName(String tenantName);
}
DAO 레이어에서 호출
@Override
public long countByTenantName(String tenantName) {
return repository.countByTenantName(tenantName);
}
분명히 지금 구현되어 있습니다 DATAJPA-231
모두 감사합니다! 이제 작동합니다.DATAJPA-231
count… By… 메소드를 find… By ones와 같이 생성 할 수 있다면 좋을 것입니다. 예:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
저는 몇 주 동안 만 작업했지만 이것이 가능하다고는 믿지 않지만 조금 더 노력하면 동일한 효과를 얻을 수 있습니다. 쿼리를 직접 작성하고 메서드 이름에 주석을 달면됩니다. 메서드를 직접 작성하는 것보다 훨씬 간단하지는 않지만 제 생각에는 더 깨끗합니다.
편집 : 이제 DATAJPA-231 에 따라 가능합니다.
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
여기에 샘플 사용자 정의 쿼리보다 여러 조건을 기반으로 카운트를 얻고 싶다면
@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);