Spring CrudRepository findByInventoryIds (List <Long> inventoryIdList)-IN 절과 동일


169

Spring CrudRepository에서 필드에 대한 "IN 절"을 지원합니까? 즉, 다음과 비슷한 것입니까?

 findByInventoryIds(List<Long> inventoryIdList) 

그러한 지원을 이용할 수 없다면 어떤 우아한 옵션을 고려할 수 있습니까? 각 ID에 대한 실행 쿼리가 최적이 아닐 수 있습니다.

답변:


283

findByInventoryIdIn(List<Long> inventoryIdList) 트릭을해야합니다.

HTTP 요청 매개 변수 형식은 다음과 같습니다.

Yes ?id=1,2,3
No  ?id=1&id=2&id=3

JPA 리포지토리 키워드의 전체 목록은 현재 설명서 목록 에서 찾을 수 있습니다 . 그것은 쇼 IsIn당신은 가독성을 위해 동사를 선호하는 경우 - - 해당하며 그 JPA도 지원 NotIn하고 IsNotIn.


고마워요, 정확히 내가 찾고 있었어요. 그들은 CrudRepository 페이지에 문서화되어 있거나 코드를 읽음으로써 발견됩니까?
에스프레소

1

감사. "보석은 부록 B에 숨겨져있다"라는
에스프레소

11
참조 문서 URL이 변경됨
Mayjak

1
메소드 서명의 경우 : List <Person> findByIdIn (List <Integer> ids); 오류가 발생했습니다. 원인 : java.lang.NumberFormatException : 입력 문자열 : "(1, 2)"
user64141

103

Spring CrudRepository의 메소드에 대해서는 @Query를 직접 지정할 수 있어야합니다. 이와 같은 것이 작동해야합니다.

@Query( "select o from MyObject o where inventoryId in :ids" )
List<MyObject> findByInventoryIds(@Param("ids") List<Long> inventoryIdList);

고마워, 이것은 작동합니다. @Query를 작성하지 않고 "보다 깨끗한"솔루션을 찾고있었습니다.
에스프레소

3
올리버 지 에르케 (Oliver Gierke)는 이에 대한 답을 알고있는 사람이며 "보다 깨끗한"솔루션을 가지고 있습니다. 그의 대답을 받아 들여야합니다.
digitaljoel

1
큰! Set<String>매개 변수로 사용하고 잘 작동했습니다.
BlueBird

두 개의 매개 변수를 메소드 하나의 목록과 다른 일반 문자열에 전달하려면 어떻게됩니까? 예는 어떻게 방법 이름 진대
user3614936

22

예, 지원됩니다.

메소드 이름 내에서 지원되는 키워드 는 여기 에 제공된 문서를 확인하십시오 .

@Query 어노테이션 을 사용하지 않고 사용자 정의 조회를 작성 하지 않고 저장소 인터페이스에서 메소드를 정의 할 수 있습니다 . 귀하의 경우 다음과 같습니다.

List<Inventory> findByIdIn(List<Long> ids);

인벤토리 엔티티와 InventoryRepository 인터페이스 가 있다고 가정합니다 . 귀하의 경우 코드는 다음과 같습니다.

엔터티

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

리포지토리

@Repository
@Transactional
public interface InventoryRepository extends PagingAndSortingRepository<Inventory, Long> {

  List<Inventory> findByIdIn(List<Long> ids);

}

이것은 CrudRepository 인터페이스를 확장하는 모든 인터페이스에서 작동합니다 .
Dzinot

1
ID 크기가 1000 이상이거나 DB에 따라 특정 크기 인 경우에는 작동하지 않습니다. 이건 어때요? List <Inventory> findByIdIn (List <Long> id, 페이징 가능한 페이징 가능);
Julie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.