首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JPQL将列表传递到WHERE IN子句会导致IllegalArgumentException

使用JPQL将列表传递到WHERE IN子句会导致IllegalArgumentException
EN

Stack Overflow用户
提问于 2018-08-31 00:25:42
回答 1查看 805关注 0票数 0

今天,当我尝试使用Hibernate和JPQL通过对象的ids从数据库获取对象时,我发现了一个(奇怪的)问题。

我调用的方法是:

代码语言:javascript
运行
复制
List<User> userList = userDao.findUsersByIds(ids);

具体内容如下:

代码语言:javascript
运行
复制
@Repository
public interface UserDao extends JpaRepository<User, Long> {
(...)
       @Query("SELECT u FROM User u " +
                "WHERE u.id IN :ids")
        List<User> findUsersByIds(@Param("ids") List<Long> ids);
}

我想不出这个问题的根本原因是什么,因为传递的列表是List<Long>类型的。不过,它会导致以下堆栈跟踪:

代码语言:javascript
运行
复制
Caused by: java.lang.IllegalArgumentException: Parameter value element [37] did not match expected type [java.lang.Long (n/a)]
at org.hibernate.query.spi.QueryParameterBindingValidator.validateCollectionValuedParameterBinding(QueryParameterBindingValidator.java:77) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:46) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:27) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.internal.QueryParameterListBindingImpl.validate(QueryParameterListBindingImpl.java:75) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.internal.QueryParameterListBindingImpl.setBindValues(QueryParameterListBindingImpl.java:33) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.internal.AbstractProducedQuery.setParameterList(AbstractProducedQuery.java:568) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:490) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:106) ~[hibernate-core-5.3.3.Final.jar:5.3.3.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 00:28:50

尝试这个(如果您使用的是spring,则使用查询方法):

代码语言:javascript
运行
复制
List<User> findAllByIdIn(List<Long> id);

或者JPQL:

代码语言:javascript
运行
复制
@Query("SELECT u FROM User u WHERE u.id IN ?1")
List<User> findUsersByIds(List<Long> id);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52101663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档