openJPA IN参数类型作为集合

时间:2012-09-29 00:01:17

标签: jpa openjpa

使用openJPA时,我可以将List作为IN参数吗?我使用的数据库是MySQL最新版本。我正在尝试工作的示例查询如下,并粘贴我得到的错误。请让我知道我需要做些什么来实现这个目标。

Select * from table t where c in (?)

.createNativeQuery(TOPIC)
.setParameter(1, listNo)

Where listNo is List<Long>

错误

19:46:47,376 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-6) JBAS014134: EJB Invocation failed on component TopicService for method public abstract com.zreflect.emyed.vo.circle.TopicVO[] com.zreflect.emyed.ejb.interfaces.ITopicService.getSelectedTopics(long,java.util.List,com.zreflect.emyed.vo.UserSession): javax.ejb.EJBException: <openjpa-2.2.0-r422266:1244990 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: The specified parameter of type "class java.util.ArrayList" is not a valid query parameter.

3 个答案:

答案 0 :(得分:1)

您没有指定代码段是JPQL还是原始SQL。 还有两种构建查询的方法: NamedQueries 要么 CriteriaBuilder。 甚至更多。

我认为最简单的方法是使用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语句。

塞巴斯蒂安

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

ParameterExpression怎么样?如何使用ParameterExpression和TypedQuery.setParameter构建一个'in'表达式?

相关问题