将参数设置为 IN 表达式的列表 [英] Setting a parameter as a list for an IN expression

查看:31
本文介绍了将参数设置为 IN 表达式的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

有没有其他人能够让它工作,如果是这样,如何?

这是一些示例代码:

Listlogins = em.createQuery("SELECT a.accountManager.loginName " +来自帐户 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).在 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 更多

解决方案

你的JPQL无效,去掉括号

Listlogins = em.createQuery("SELECT a.accountManager.loginName " +来自帐户 a" +"WHERE a.id IN :ids").setParameter("ids",Arrays.asList(new Long(1000100), new Long(1000110))).getResultList();

Whenever I try to set a list as a parameter for use in an IN expression I get an Illegal argument exception. Various posts on the internet seem to indicate that this is possible, but it's certainly not working for me. I'm using Glassfish V2.1 with Toplink.

Has anyone else been able to get this to work, if so how?

here's some example code:

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();

and the relevant part of the stack trace:

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

解决方案

Your JPQL is invalid, remove the brackets

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();

这篇关于将参数设置为 IN 表达式的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆