Передача списка в spring data JPA собственный запрос

используя spring data 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.

Я пробовал List , Integer [], Object[] и String, но он не работает...

Не могу ли я передать список значений?

какой лучший подход для создания такого рода запросов?

спасибо!

3 ответов


используйте JPQL. Собственный запрос передается или должен передаваться в базу данных точно так же, как вы создали строку SQL, и если ваш драйвер не может принять сериализованную коллекцию и понять, что один параметр должен интерпретироваться как много, он просто не будет работать. Коллекция, которую вы передаете, нуждается в SQL, расширенном из (?) к (?, ?,...) на основе количества элементов в коллекции, и драйверы JDBC просто не в состоянии сделать это, и поставщики JPA обязаны выполнить строку как есть.

запрос JPQL позволяет поставщику JPA создавать необходимый ему SQL динамически на основе переданного списка, поэтому он может расширить коллекцию для вас.


попробуйте убрать @Query и сделать имя метода:

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

см. таблицу 2.2 в ссылке:http://docs.spring.io/spring-data/jpa/docs/1.2.0.RELEASE/reference/html/


попробуйте выполнить запрос следующим образом:

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

это работает?