2013-10-25 3 views
4

, 나는 쿼리의 이런 종류를 만들기 위해 노력하고 스프링 데이터 JPA의 목록 전달 기본 쿼리 스프링 데이터 JPA를 사용

@Query(nativeQuery = true, 
     value = "SELECT * FROM events WHERE typeId IN (?1)") 
List<Event> findEventsByType(List<Integer> types); 

(더 복잡,이 간단한 경우입니다) 예외가 발생합니다 : 나는 목록을 < 정수를 시도

org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use. 

>, 정수 [], [] 및 문자열 개체 만이 작동하지 않습니다 ...

내가 값의 목록을 통과하지 수 있습니까?

이런 종류의 쿼리를 만드는 가장 좋은 방법은 무엇입니까?

감사합니다.

+0

이것은 상당히 오래된 게시물이지만이를 해결할 수 있었습니까? –

답변

3

사용 JPQL을. 네이티브 쿼리는 SQL 문자열을 생성 한 것과 똑같이 데이터베이스에 전달되거나 전달되어야하며, 드라이버가 직렬화 된 컬렉션을 취할 수 있고 단일 매개 변수를 많은 수로 해석해야하는 경우가 아니면 작동하지 않습니다. 당신이 전달하는 콜렉션은 콜렉션의 요소 수에 따라 (?)에서 (?,?, ...)로 확장 된 SQL을 필요로하며, JDBC 드라이버는이를 수행 할 수 없으며 JPA 제공자는 있는 그대로 문자열을 실행하십시오.

JPQL 쿼리를 통해 JPA 공급자는 전달 된 목록을 기반으로 동적으로 필요한 SQL을 만들 수 있으므로 컬렉션을 확장 할 수 있습니다. 이 같은

12

@query을 멀리 복용 시도하고 메소드 이름 확인 : 링크에

public List<Event> findByTypeIn(List<Integer> types); 

참조 표 2.2 : http://docs.spring.io/spring-data/jpa/docs/1.2.0.RELEASE/reference/html/

+0

실제 쿼리가 더 복잡하기 때문에 그 작업을 수행 할 수 없습니다. 나는 여기에 기본 경우를 보여 주었다. –

0

시도의 질의 :

@Query(nativeQuery = true, 
     value = "SELECT * FROM events WHERE typeId = ?1") 
List<Event> findEventsByType(List<Integer> types); 

작동 했습니까?

관련 문제