15

使用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 >、Integer[]、Object[] 和 String 但它不起作用...

我不能传递值列表吗?

哪种是进行此类查询的最佳方法?

谢谢!

4

9 回答 9

13

尝试删除 @Query 并命名方法名称:

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

请参阅链接中的表 2.2:http: //docs.spring.io/spring-data/jpa/docs/1.2.0.RELEASE/reference/html/

于 2013-10-25T13:56:27.667 回答
6

我尝试如下,它对我有用。

@Query(value = "select * from events where type_id in :types", nativeQuery = true)
List<Event> findEventsByType(@Param("types") List<Integer> types);
于 2018-12-04T10:37:51.937 回答
5

使用 JPQL。原生查询被或应该完全按照您创建 SQL 字符串的方式传递到数据库,除非您的驱动程序可以采用序列化集合并理解单个参数需要被解释为多个参数,否则它将无法正常工作。您传入的集合需要根据集合中元素的数量从 (?) 扩展到 (?, ?,...) 的 SQL,而 JDBC 驱动程序无法做到这一点,并且需要 JPA 提供程序按原样执行字符串。

JPQL 查询允许 JPA 提供者根据传入的列表动态创建所需的 SQL,因此它可以为您扩展集合。

于 2013-10-25T15:02:59.327 回答
5
@Query(value = "SELECT c from Company c where " +
    "c.companyName IN (:company_names)")
List<Company> findCompaniesByName(@Param("company_names") List<String> companyNames);

这是您的问题的解决方案。

在这里,我传递包含公司名称的列表,我正在查询数据库并将结果存储在列表中。

希望这有帮助!

于 2020-10-27T03:43:08.627 回答
1

尝试这个。它适用于 SpringBoot JPA 中的 Native Query:

@Query(value = "SELECT * FROM table WHERE columnName IN (:inputList)" , 
     nativeQuery = true)
List<Object> findByObjectList(@Param("inputList") List<Object> inputList);

如果是 JPA,请尝试以下操作:

List<Object> findByObjectList(List<Object> inputList)
于 2019-01-28T09:12:38.373 回答
1

我知道这有点脱离上下文(我们使用更新而不是选择),但这对其他人有用:


    /**
     * Update the state of list of entities using their ids
     * @param ids request ids
     * @param state new state
     * @return
     */
    @Modifying
    @Query(value = "UPDATE AbstractRequest SET state = :state WHERE id IN (:ids)")
    int updateStates(@Param("ids") List<Long> ids, @Param("state") InternalRequestStep state);
于 2019-11-13T15:33:18.037 回答
0

尝试像这样查询:

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

它起作用了吗?

于 2017-03-09T09:02:51.300 回答
0

在 IN 子句中以这种方式传递数组

@Query(value = "select name from teams where name in :names", nativeQuery = true)
List<String> getNames(@Param("names") String[] names);

这样叫

String[] names = {"testing team","development team"};
List<String> teamtest = teamRepository.getNames(names);
于 2019-09-19T11:26:07.357 回答
0

删除参数周围的括号(?1)。您的查询值应如下所示:

@Query(value = "SELECT * FROM events WHERE typeId IN ?1")
于 2021-09-03T18:00:27.623 回答