【问题标题】:openJPA IN parameter type as collectionopenJPA IN 参数类型作为集合
【发布时间】:2012-09-29 00:01:17
【问题描述】:

在使用 openJPA 时,我可以将 List<Long> 作为 IN 参数吗?

我使用的数据库是 MySQL 最新版本。我正在尝试工作的示例查询如下,并且还粘贴了我得到的错误。请让我知道我需要做什么才能使其正常工作。

Select * from table t where c in (?)
.createNativeQuery(TOPIC)
.setParameter(1, listNo)

listNoList<Long>

错误

19:46:47,376 错误 [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-6) JBAS014134:在方法公共抽象 com.zreflect.emyed.vo 的组件 TopicService 上的 EJB 调用失败。 circle.TopicVO[] com.zreflect.emyed.ejb.interfaces.ITopicService.getSelectedTopics(long,java.util.List,com.zreflect.emyed.vo.UserSession): javax.ejb.EJBException: org.apache.openjpa.persistence.ArgumentException: 类型为“class java.util.ArrayList”的指定参数不是有效的查询参数。

【问题讨论】:

  • 为什么是“本地”查询? JPQL 允许 IN 查询获取列表

标签: jpa openjpa


【解决方案1】:

您没有指定 sn-p 是 JPQL 还是原始 SQL。 还有另外两种构建查询的方法: 命名查询 或者 标准生成器。 可能更多。

我认为最简单的方法是使用 JPQL 查询。

String JPQL = "Select * from table t where c in (:value)"

ArrayList<Integer> myList = new ArrayList<Integer>();
myList.add(1);

可以使用方法:

TypedQuery.setParameter("value",myList);

见: http://docs.oracle.com/javaee/6/api/javax/persistence/TypedQuery.html#setParameter%28java.lang.String,%20java.lang.Object%29

但是:列表总是需要至少包含一项。我认为空列表不起作用,或者产生错误的 SQL 语句。

塞巴斯蒂安

【讨论】:

    【解决方案2】:

    我已将数组转换为以逗号分隔的字符串并传递参数值。

    由于本机查询不支持数组,因此现在以这种方式工作。

    【讨论】:

      【解决方案3】:

      参数表达式怎么样?如何使用 ParameterExpression 和 TypedQuery.setParameter 构造“in”表达式?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-10
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多