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

26 浏览
0 Comments

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

每当我尝试将一个列表设置为用于IN表达式的参数时,我都会收到一个非法参数异常。互联网上的各种帖子似乎表明这是可能的,但对我来说肯定不起作用。我正在使用Glassfish V2.1和Toplink。

如果其他人能够使其正常工作,那么是如何做到的呢?

以下是一些示例代码:

List 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: 您尝试为参数accountIds设置一个类型为java.util.Arrays$ArrayList的值,但期望类型为java.lang.Long,查询字符串为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

0