将列表作为参数传递给JPQL命名查询不起作用

时间:2015-08-14 07:36:53

标签: java jpa eclipselink jpql weblogic12c

我有一个以这种方式声明的JPQL命名查询:

@NamedQuery(name = "Client.findByInternalIds", query =
     "select o from Client o where o.internalId in (:internalIds)")

这里,:internalIds应该是我在运行时作为参数传递给命名查询的列表。每当我尝试这样做时都会出现问题:

@Override
public List<Client> getClientsByInternalIds(List<Integer> internalIds) {
    TypedQuery<Client> nq = em.createNamedQuery("Client.findByInternalIds", Client.class);
    nq.setParameter("internalIds", internalIds);
    return nq.getResultList();
}

我基本上得到了这个错误(例外)

  

java.lang.IllegalArgumentException:您试图设置类型类java.util.ArrayList的值   对于具有预期类型类的参数internalIds   来自查询字符串的java.lang.Integer从Client o中选择o   o.internalId in(:internalIds)

我在互联网上寻找解决方案,似乎所有人都说我的语法是正确的,所以有人能帮我解决这个问题吗?谢谢。

仅供参考,使用WebLogic 12c和EclipseLink。

1 个答案:

答案 0 :(得分:1)

我实际上对语法不正确,经过多次尝试后,简单的解决方案是删除internalIds定义中@NamedQuery参数的括号。

所以@NamedQuery变成了这个:

@NamedQuery(name = "Client.findByInternalIds", query =
     "select o from Client o where o.internalId in :internalIds")

它有效!