在查询openJPA时进行org.apache.openjpa.persistence.ArgumentException

时间:2012-05-18 14:57:24

标签: jpa jpql

假设我有一个与列表中存储的实体相关联的ID列表。如果我将这个列表传递给函数,如果我在JPQL中使用IN关键字,那么我应该得到与我在假设的reqular查询语言中使用相同的功能...

但每当我尝试运行代码时,我都会遇到异常...我的代码看起来像这样......

public void UpdateEntityByPerson(int ID, int[] EntityIDs) {
    // TODO Auto-generated method stub
    List<EntityList> distList = null;//new ArrayList<EntityList>();
    try{        
        Provider prov = emf.find(Provider.class, new Long(ID));
        prov.setDistListPermCollection(null);
        distList = emf.createNamedQuery("getEntityListByListIds").setParameter("listIds", EntityIDs).getResultList();
        prov.setEntityListPermCollection(distList);         
    }
    catch(Exception ex){
        System.out.println("Exception : "+ex);
        ex.printStackTrace();
    }
}

这是我的JPQL命名查询...

@NamedQuery(name="getEntityistByListIds", query = "SELECT d FROM EntityList d WHERE d.listId in :listIds"),

我在这里做错了什么?我想到的一件事是我有一个整数数组......实体ID实际上很长......这可能会导致轻微的酿造 - 哈哈!

1 个答案:

答案 0 :(得分:1)

当EntityList中的listId属性类型为long时,IN的参数类型必须为单Longlong值或List<Long>。因此,在您的以下类型的论证中适用:

List<Long> EntityIDs = Arrays.asList(new Long[]{1L, 2L});
Long EntityIDs = 0;
long EntityIDs = 0;

在规范中,这是拼写更一般的形式如下:

  

文字和/或输入参数值必须相同   类型中state_field_path_expression的抽象模式类型。

     

只允许比较相似类型的值。一种类型   如果它们对应于相同的Java语言类型,则像其他类型一样   或者如果一个是原始Java语言类型而另一个是原始Java语言类型   wrafolred Java类类型等价(例如,int和Integer就像   这种意义上的类型)。这条规则有一个例外:它是有效的   比较数值促销规则的数值   应用。尝试比较非类似类型的条件表达式   除了这个数字情况外,不允许使用这些值。

对我而言,根据规范,当路径指向long时,你可以给IN提供int参数,但至少在Hibernate的实现中并非如此。