每当我尝试将列表设置为在 IN 表达式中使用的参数时,都会出现非法参数异常。互联网上的各种帖子似乎表明这是可能的,但它肯定不适合我。我正在使用带有 Toplink 的 Glassfish V2.1。
有没有其他人能够让这个工作,如果是这样怎么办?
这是一些示例代码:
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();
以及堆栈跟踪的相关部分:
java.lang.IllegalArgumentException:您试图从查询字符串 SELECT a.accountManager.loginName FROM Account a WHERE a 中为参数 accountIds 设置类型为 class java.util.Arrays$ArrayList 的值,预期类型为 java.lang.Long .id IN (:accountIds)。 在 oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.setParameterInternal(EJBQueryImpl.java:663) 在 oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.setParameter(EJBQueryImpl.java:202) 在 com.corenap.newtDAO.ContactDaoBean.getNotificationAddresses(ContactDaoBean.java:437) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011) 在 com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175) 在 com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920) 在 com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011) 在 com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203) ... 67 更多