将参数设置为IN表达式的列表

per*_*hap 23 java jpa glassfish jpql toplink-essentials

每当我尝试将列表设置为在IN表达式中使用的参数时,我都会得到一个Illegal参数异常.互联网上的各种帖子似乎表明这是可能的,但它肯定不适合我.我正在使用Glassfish V2.1和Toplink.

有没有其他人能够让这个工作,如果是这样的话怎么样?

这是一些示例代码:

List<String> logins = em.createQuery("SELECT a.accountManager.loginName " +
    "FROM Account a " +
    "WHERE a.id IN (:ids)")
    .setParameter("ids",Arrays.asList(new Long(1000100), new Long(1000110)))
    .getResultList();
Run Code Online (Sandbox Code Playgroud)

以及堆栈跟踪的相关部分:

java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.Arrays$ArrayList for parameter accountIds with expected type of class java.lang.Long from query string SELECT a.accountManager.loginName FROM Account a WHERE a.id IN (:accountIds).
at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.setParameterInternal(EJBQueryImpl.java:663)
at oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.setParameter(EJBQueryImpl.java:202)
at com.corenap.newtDAO.ContactDaoBean.getNotificationAddresses(ContactDaoBean.java:437)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175)
at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
... 67 more

Jam*_*mes 38

您的JPQL无效,请删除括号

List<String> logins = em.createQuery("SELECT a.accountManager.loginName " +
    "FROM Account a " +
    "WHERE a.id IN :ids")
    .setParameter("ids",Arrays.asList(new Long(1000100), new Long(1000110)))
    .getResultList();
Run Code Online (Sandbox Code Playgroud)

  • @ lukas84那是因为你最有可能使用[hibernate Query](https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html)而不是[persistence Query](http: //docs.oracle.com/javaee/6/api/javax/persistence/Query.html) (2认同)

per*_*hap 20

我找到了答案,JPA 1.0中不支持列表作为参数; 但是,JPA 2.0支持它.

Glassfish v2.1的默认持久性提供程序是Toplink,它实现了JPA 1.0,要获得JPA 2.0,您需要EclipseLink,这是Glassfish v3预览的默认设置,或者可以插入到v2.1中.

- 罗兰

  • 并且你的JPQL错了,删除括号 (10认同)
  • 错误.它依赖于Hibernate实现的JPA 1.0的实现,但需要括号. (3认同)

小智 10

希望这对某人有所帮助.我遇到了这个问题并做了以下事情来解决(使用eclipselink 2.2.0)

  1. 我在类路径中有JavaEE jar以及jpa 2 jar(javax.persistence*2*).从类路径中删除了JavaEE.

  2. 我正在使用类似的东西 " idItm IN ( :itemIds ) "抛出异常:

类型类java.util.ArrayList,用于参数itemIds,具有来自查询字符串的类java.lang.String的预期类型

解决方案:我刚刚将in条件更改为 " idItm IN :itemIds ",即删除了括号().