it-source

스프링 데이터에서의 findBy와 findOneBy의 차이점 JPA

criticalcode 2023. 3. 27. 21:19
반응형

스프링 데이터에서의 findBy와 findOneBy의 차이점 JPA

지금까지 알고 있는 것은 FindBy는 여러 결과를 반환할 수 있는 반면 FindOneBy는 단일 결과를 반환하거나 다음과 같이 사용할 경우 null을 반환하는 것입니다.

List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);

이제 제 질문은 findBy를 이 방법으로 사용해도 될까요?

Department  findByDepartmentId(Long Id);

만약 그렇다면,

  • 주어진 ID에 대한 레코드가 여러 개 있다고 가정합니다.
  • findBydepartmentId는 어떤 기준으로 단일 레코드를 반환합니까?

마지막으로 findOneBy 대신 findBy를 사용하면 안 되는 이유 또는 시기입니다.

사용할 수 있습니까?findBy이쪽으로요?부서findByDepartmentId(Long Id);

네, 이 구문은 Spring JPA의 관점에서 볼 때 기술적으로 정확합니다.Spring JPA는 반품 유형도 확인함으로써 달성하고자 하는 바를 추론합니다.

기본적으로 반환 타입의 경우는 다음과 같습니다.

  • 쿼리를 사용하여 단일 값을 반환할 수 있습니다.basic type,Entity T, , 등

  • 쿼리를 사용하여 T 컬렉션을 반환할 수 있습니다. , , 등을 지정할 수 있습니다.

즉, 쿼리 정의는 다음과 같습니다.

Department findByDepartmentId(Long Id);

1개의 결과를 기대하는 것을 의미합니다(지정되어 있기 때문에).Entity T반환 타입으로서).이것은 Spring JPA가 쿼리를 실행하는 방법을 반영합니다.이것은 인터페이스를 호출하고, 이 인터페이스를 호출하면, 이 라우터는,exception둘 이상의 개체가 기준을 충족하는 경우.

어떤 기준으로 할 것인가?findBydepartmentId싱글 레코드를 반환할 수 있습니까?

해당 ID를 가진 단일 개체가 있으면 예외가 발생합니다.

언제 또는 왜 사용하지 않는가?findBy대신해서findOneBy?

그 두 가지는 다른 의미를 가지고 있고 서로 바꿀 수 없다.

findOneBy는 항상 호출됩니다.

findBy위의 정의에 따라 반환 유형에 따라 동작이 달라집니다.

findOneByXX는 값이 1개만 있는지 없는지 확인합니다.값이 2개일 경우 예외가 느려집니다.

하지만findByXX독특함을 체크하는 건 아닙니다

몇 가지 테스트를 수행했는데 Spring Data는 메서드 사이의 모든 문자를 무시합니다(find,delete,...) 및By.

https://github.com/spring-projects/spring-data-commons/blob/14d5747f68737bb44441dc511cf16393d9d85dc8/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L65에서는\p{Lu}.*?syslog.syslog.

스프링 데이터는 반응 처리 방법을 결정하는 데 반환 유형만 사용합니다.

따라서 의미론적으로 정확하지 않더라도 다음 방법을 정의할 수 있습니다.

Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);

언급URL : https://stackoverflow.com/questions/45988295/difference-between-findby-and-findoneby-in-spring-data-jpa

반응형