SpringData JPA에는 메서드 이름 확인을 사용하여 엔터티를 계산하는 방법이 있습니까?


127

SpringData JPA 는 사양을 사용하여 엔티티 계산을 지원합니다. 그러나 메서드 이름 확인을 사용하여 엔터티를 계산하는 방법이 있습니까? countByName특정 이름을 findByName가진 모든 항목을 가져 오는 방법처럼 특정 이름을 가진 항목을 계산 하는 방법 을 원한다고 가정 해 보겠습니다 .


6
답변 중 하나 인 YaoFeng을 수락하십시오. SpringData JPA 1.5.2를 테스트했으며 countByName () 구문이 Abel 노트로 작동합니다.
nullPainter 2014

답변:


216

현재 봄 데이터 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);
}

또한 확인 이 너무 대답을 .


3
합계, 평균과 같은 다른 집계 함수는 어떻습니까?
lrkwz 2015

질문은 합계 나 평균이 아니라 계수 함수에 관한 것이 었습니다. Spring 데이터는 아직이 함수에 대해 '새로운 방식'과 같은 것을 지원하지 않습니다. 당신은 같은 것을 사용할 수있는
조지 Siggouroglou

1
두 번째와 세 번째 예에서는 "SELECT COUNT (u) ..."를 사용해야한다고 생각합니다. 이것은 카운트 쿼리 여야하기 때문입니다.
TheChrisPratt

당신의 의견에 감사드립니다. 제 실수였습니다.
George Siggouroglou 2015

평민 - 랭 -하지 wrorry, 그것은 발견
NickJ

19

1.4 버전을 사용하지 않는 한 명시 적 주석을 사용할 수 있습니다.

예:

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

3
메서드가 long대신 반환되어야합니다 int. 그렇지 않으면 단서없이 ClassCastException이 발생합니다
Rangi Lin

13

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)는 expamle-search에 포함되어 있습니다. 즉 int age설정되지는 않았지만 포함되지만 Integer age샘플에서 제외됩니다 (적어도 Eclipselink에서)
LeO

이것이 바로 제가 찾던 것입니다. 감사합니다!
emrekgn


8

작업 예

@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);
}

5

Abel에 따르면 버전 1.4 이후 (버전 1.4.3.RELEASE에서 테스트 됨)는 다음과 같이 가능합니다.

public long countByName (문자열 이름);



2

모두 감사합니다! 이제 작동합니다.DATAJPA-231

count… By… 메소드를 find… By ones와 같이 생성 할 수 있다면 좋을 것입니다. 예:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

저는 몇 주 동안 만 작업했지만 이것이 가능하다고는 믿지 않지만 조금 더 노력하면 동일한 효과를 얻을 수 있습니다. 쿼리를 직접 작성하고 메서드 이름에 주석을 달면됩니다. 메서드를 직접 작성하는 것보다 훨씬 간단하지는 않지만 제 생각에는 더 깨끗합니다.

편집 : 이제 DATAJPA-231 에 따라 가능합니다.


0
@Autowired
private UserRepository userRepository;

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

1
이 예제는 주제가 아닙니다. 사용자는 REST 서비스에서 기본 개수를 호출하는 방법이 아닌 countBy 필드 이름에 대해 질문했습니다.
Jad B.

0

여기에 샘플 사용자 정의 쿼리보다 여러 조건을 기반으로 카운트를 얻고 싶다면

@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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.