여러 결과를 반환하는 쿼리 메서드는 표준 Java Iterable, List 및 Set을 사용할 수 있습니다.
그 외에도 Iterable의 사용자 정의 확장인 Spring Data의 Streamable과 Vavr에서 제공하는 컬렉션 유형 반환을 지원합니다.
지원되는 모든 쿼리 메서드 반환 유형을 설명하는 부록을 참조하세요.
🔍 지원되는 쿼리 반환 유형
일반적으로 Spring Data 리포지토리에서 지원하는 반환 유형
여기에 나열된 일부 유형은 특정 저장소에서 지원되지 않을 수 있으므로 지원되는 반환 유형의 정확한 목록은 저장소 별 문서를 참조.
✅ 지리 공간 유형(예: GeoResult, GeoResults및 GeoPage)은 지리 공간 쿼리를 지원하는 데이터 저장소에만 사용할 수 있습니다. 일부 저장소 모듈은 자체 결과 래퍼 유형을 정의할 수 있습니다.
반환 유형 | 설명 |
void | 반환 값이 없음을 나타냅니다. |
기초 요소 | 자바 기본형 타입 |
래퍼 유형 | 자바 wrapper 타입 |
T | 고유한 개체입니다. 쿼리 메서드는 최대 하나의 결과를 반환할 것으로 예상합니다. 결과가 없으면 null반환됩니다. 둘 이상의 결과가 트리거되면 IncorrectResultSizeDataAccessException. |
Iterator<T> | Iterator. |
Collection<T> | A Collection. |
List<T> | A List. |
Optional<T> | 자바 8 또는 guava Optional. 쿼리 메서드는 최대 하나의 결과를 반환할 것으로 예상합니다. 결과가 없으면 Optional.empty()또는 Optional.absent()가 반환됩니다. 둘 이상의 결과가 트리거되면 IncorrectResultSizeDataAccessException. |
Option<T> | Scala 또는 Vavr Option유형입니다. Optional앞에서 설명한 Java 8과 의미적으로 동일한 동작 입니다. |
Stream<T> | 자바 8 Stream. |
Streamable<T> | 해당 디렉토리 의 편리한 확장은 Iterable결과를 스트리밍, 매핑 및 필터링하고 연결하는 등의 메서드를 노출합니다. |
생성자 또는 팩토리 메소드 인수 를 구현 Streamable하고 취하는 유형Streamable | ….of(…)인수로 사용하는 생성자 또는 / ….valueOf(…)팩토리 메소드 를 노출하는 유형입니다 Streamable. 자세한 내용은 스트리밍 가능한 사용자 지정 래퍼 유형 반환을 참조하세요. |
Vavr Seq, List, Map,Set | Vavr 컬렉션 유형. 자세한 내용은 Vavr 컬렉션 지원을 참조 하십시오. |
Future<T> | A Future. 메서드에 주석이 달릴 것으로 예상하고 @AsyncSpring의 비동기 메서드 실행 기능을 활성화해야 합니다. |
CompletableFuture<T> | 자바 8 CompletableFuture. 메서드에 주석이 달릴 것으로 예상하고 @AsyncSpring의 비동기 메서드 실행 기능을 활성화해야 합니다. |
ListenableFuture | A org.springframework.util.concurrent.ListenableFuture. 메서드에 주석이 달릴 것으로 예상하고 @AsyncSpring의 비동기 메서드 실행 기능을 활성화해야 합니다. |
Slice<T> | 사용 가능한 데이터가 더 있는지 여부를 나타내는 크기가 지정된 데이터 청크입니다. Pageable메소드 매개변수 가 필요합니다 . |
Page<T> | Slice총 결과 수와 같은 추가 정보가 있는 A. Pageable메소드 매개변수 가 필요합니다 . |
GeoResult<T> | 참조 위치까지의 거리와 같은 추가 정보가 포함된 결과 항목입니다. |
GeoResults<T> | GeoResult<T>참조 위치까지의 평균 거리와 같은 추가 정보가 포함 된 목록입니다 . |
GeoPage<T> | Page참조 위치까지의 평균 거리 와 GeoResult<T>같은 A. |
Mono<T> | Mono반응형 저장소를 사용하여 0개 또는 1개의 요소를 방출 하는 프로젝트 반응기 . 쿼리 메서드는 최대 하나의 결과를 반환할 것으로 예상합니다. 결과가 없으면 Mono.empty()반환됩니다. 둘 이상의 결과가 트리거되면 IncorrectResultSizeDataAccessException. |
Flux<T> | Flux반응 저장소를 사용하여 0, 1 또는 많은 요소를 방출 하는 프로젝트 반응기 . 반환되는 쿼리 Flux는 또한 무한한 수의 요소를 방출할 수 있습니다. |
Single<T> | Single반응형 저장소를 사용하여 단일 요소를 방출하는 RxJava 입니다. 쿼리 메서드는 최대 하나의 결과를 반환할 것으로 예상합니다. 결과가 없으면 Mono.empty()반환됩니다. 둘 이상의 결과가 트리거되면 IncorrectResultSizeDataAccessException. |
Maybe<T> | Maybe반응 리포지토리를 사용하여 0개 또는 1개의 요소를 방출 하는 RxJava 입니다. 쿼리 메서드는 최대 하나의 결과를 반환할 것으로 예상합니다. 결과가 없으면 Mono.empty()반환됩니다. 둘 이상의 결과가 트리거되면 IncorrectResultSizeDataAccessException. |
Flowable<T> | Flowable반응 리포지토리를 사용하여 0, 1 또는 많은 요소를 방출 하는 RxJava 입니다. 반환되는 쿼리 Flowable는 또한 무한한 수의 요소를 방출할 수 있습니다. |
1. Streamable을 쿼리 메서드 반환 유형으로 사용
병렬이 아닌 스트림(Iterable에서 누락됨)에 액세스하는 편리한 방법과 요소에 대해 직접 ….filter(…) 및 ….map(…) 기능을 제공하고 Streamable을 다른 요소에 연결
// Streamable을 사용하여 쿼리 메서드 결과 결합
interface PersonRepository extends Repository<Person, Long> {
Streamable<Person> findByFirstnameContaining(String firstname);
Streamable<Person> findByLastnameContaining(String lastname);
}
Streamable<Person> result = repository.findByFirstnameContaining("av")
.and(repository.findByLastnameContaining("ea"));
2. 사용자 정의 스트리밍 가능 래퍼 유형 반환
컬렉션에 대한 전용 래퍼 유형을 제공하는 것은 여러 요소를 반환하는 쿼리 결과에 대한 API를 제공하기 위해 일반적으로 사용되는 패턴입니다.
일반적으로 이러한 유형은 컬렉션과 유사한 유형을 반환하고 래퍼 유형의 인스턴스를 수동으로 생성하는 리포지토리 메서드를 호출하여 사용됩니다.
Spring Data에서 다음 기준을 충족하는 경우 이러한 래퍼 유형을 쿼리 메서드 반환 유형으로 사용할 수 있으므로 추가 단계를 피할 수 있습니다.
1. 이 유형은 Streamable을 구현합니다.
2. 이 유형은 Streamable을 인수로 사용하는 of(…) 또는 valueOf(…)라는 이름의 생성자 또는 정적 팩토리 메서드를 노출합니다.
class Product { // product API를 노출하여 제품 가격에 접근하는 Entity
MonetaryAmount getPrice() { … }
}
@RequiredArgsConstructor(staticName = "of")
class Products implements Streamable<Product> { // Products.of(…)를 사용하여 구성할 수 있는 Streamable<Product>의 래퍼 유형(Lombok 주석으로 만든 팩토리 메서드)
// Streamable<Product>를 사용하는 표준 생성자도 마찬가지입니다.
private final Streamable<Product> streamable;
public MonetaryAmount getTotal() { // 래퍼 유형은 Streamable<Product>에서 새 값을 계산하는 추가 API를 노출합니다.
return streamable.stream()
.map(Priced::getPrice)
.reduce(Money.of(0), MonetaryAmount::add);
}
@Override
public Iterator<Product> iterator() { // Streamable 인터페이스를 구현하고 실제 결과에 위임합니다.
해당 래퍼 유형 Products는 쿼리 메서드 반환 유형으로 직접 사용할 수 있습니다
return streamable.iterator();
}
}
interface ProductRepository implements Repository<Product, Long> {
Products findAllByDescriptionContaining(String text); // Streamable<Product>를 반환하고 리포지토리 클라이언트에서 쿼리 후에 수동으로 래핑할 필요가 없습니다.
}
3. Vavr 컬렉션 지원
Vavr은 Java의 기능적 프로그래밍 개념을 수용하는 라이브러리입니다.
다음 표와 같이 쿼리 메서드 반환 타입으로 사용할 수 있는 사용자 지정 컬렉션 타입 집합과 함께 제공됩니다.
Vavr 컬렉션 타입 | 사용된 Vavr 구현 타입 | 유효한 Java 소스 타입 |
io.vavr.collection.Seq | io.vavr.collection.List | java.util.Iterable |
io.vavr.collection.Seqt | io.vavr.collection.LinkedHashSet | java.util.Iterable |
io.vavr.collection.Map | io.vavr.collection.LinkedHashMap | java.util.Map |
Vavr 컬렉션 타입: 쿼리 메서드 반환 타입으로 사용
사용된 Vavr 구현 타입: 구현 타입으로 사용
유효한 Java 소스 타입: 실제 쿼리 결과의 Java 타입에 따라
또는 Traversable(Vavr Iterable 등가물)을 선언한 다음 실제 반환 값에서 구현 클래스를 파생시킬 수 있습니다.
즉, java.util.List는 Vavr List 또는 Seq로 바뀌고 java.util.Set은 Vavr LinkedHashSet Set이 되는 식이다.
레퍼런스
'Spring > JPA' 카테고리의 다른 글
Spring JPA - 스트리밍 쿼리 결과 (0) | 2022.10.14 |
---|---|
Spring JPA - 리포지토리 메서드의 Null 처리 (0) | 2022.10.14 |
Spring JPA - 쿼리 결과 제한 (0) | 2022.10.14 |
Spring JPA - 특수 매개변수 처리 (0) | 2022.10.14 |
Spring JPA - 속성 표현식 (0) | 2022.10.14 |