Передача списка в 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);
это работает?