使用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.
答案 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);
但是:列表总是需要至少有一个项目。我认为空列表不起作用,或者产生错误的SQL语句。
塞巴斯蒂安
答案 1 :(得分:0)
我已将数组转换为以逗号分隔的字符串并传递参数值。
现在正在以这种方式工作,因为本机查询不支持数组。
答案 2 :(得分:0)
ParameterExpression怎么样?如何使用ParameterExpression和TypedQuery.setParameter构建一个'in'表达式?