1

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

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

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"),

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

4

1 回答 1

1

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

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

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

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

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

对我来说,根据规范,int当路径指向 long 时,您还可以为 IN 提供参数,但至少 Hibernate 的实现并非如此。

于 2012-05-18T16:51:26.007 回答