programing

findBy / findAllBy의 스프링 데이터 JPA 차이

sourcetip 2022. 10. 28. 23:21
반응형

findBy / findAllBy의 스프링 데이터 JPA 차이

Spring Data JPA 키워드를 사용할 때 다음 사이에 차이가 있습니까?

List<SomeEntity> findBySomeCondition();

그리고.

List<SomeEntity> findAllBySomeCondition();

아니요, 이 둘은 차이가 없습니다.이러한 쿼리는 동일한 쿼리를 실행합니다.All메서드 이름에서 쿼리를 파생할 때 스프링 데이터에 의해 부품이 무시됩니다.유일하게 중요한 부분은By키워드, 그 뒤에 오는 모든 키워드는 필드명으로 취급됩니다(다른 키워드는 제외).OrderBy우연히도 다음과 같은 이상하게 보이는 방법 이름이 생길 수 있습니다.findAllByOrderByIdAsc).

이는 다음과 같은 것이 완벽하게 유효하다는 것을 의미합니다.

List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();

또한 다음과 같은 SQL 쿼리를 수행합니다.

List<SomeEntity> findBySomeCondition();

아니면

List<SomeEntity> findAllBySomeCondition();

스프링 데이터 2.3.6 릴리즈 매뉴얼에서는 다음 기능에 대해 설명합니다.

사이의 임의의 텍스트find(또는 기타 도입 키워드) 및By다음과 같은 결과 검색 키워드 중 하나를 사용하지 않는 한 설명에 도움이 되는 것으로 간주됩니다.Distinct생성할 쿼리에 고유 플래그를 설정하거나Top/First쿼리 결과를 제한합니다.

이 기능의 목적은 Spring Data의 다음 2.0 릴리즈에 대한 블로그 투고에서 설명되었습니다.

Spring Data 메서드 구문 분석에서는 다음과 같은 접두사 키워드를 사용합니다.find,exists,count,그리고.delete및 종료By키워드를 지정합니다.당신이 그 사이에 넣은 모든 것find그리고.By는 메서드 이름을 더욱 표현하기 쉽게 하며 쿼리 파생에는 영향을 주지 않습니다.

차이를 설명하기 위해 다음 두 가지 기능을 살펴보겠습니다.

1. Set<Policy> findAllByRoleIn(Iterable<Role> role);

2. Set<Policy> findByRoleIn(Iterable<Role> role);

첫 번째 함수에 의해 생성된 쿼리:

1.  select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))

두 번째 함수에 의해 생성된 쿼리:

2. select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))

결론:두 함수에 의해 생성된 쿼리를 보면 분명합니다.두 함수 정의 사이에 차이가 없다는 것을 명확히 알 수 있습니다. 두 함수 정의 사이에는 차이가 없습니다.

한 가지 차이점은 findAllBy Hibernate 필터(org.hibernate.annotations의 @Filters)가 적용되어 다른 SQL이 적용된다는 것입니다.

실제로 findallBy와 findby의 차이점은 findAllBy는 컬렉션을 반환하지만 findBy는 Optional을 반환한다는 것입니다.

따라서 List find By를 쓰는 대신 List find All By를 쓰는 것이 좋습니다(단, :p도 동작합니다).[ Optional find All By ]대신 [Optional find By]라고 씁니다.

이 문서 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ #sublicatories.core-displaces를 체크합니다.

findBy 메서드는 이름 또는 다음과 같은 다른 기준으로 검색할 때 사용됩니다.findByFirstName(String firstName);

find 일반적으로 사양을 제공하여 찾는 모든 메서드

List<T> findAll(Specification<T> spec);

자세한 내용은 아래 문서를 참조하십시오.

http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html

언급URL : https://stackoverflow.com/questions/37253571/spring-data-jpa-difference-between-findby-findallby

반응형