假设我有一个与列表中存储的实体相关联的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实际上很长......这可能会导致轻微的酿造 - 哈哈!
答案 0 :(得分:1)
当EntityList中的listId属性类型为long时,IN的参数类型必须为单Long
或long
值或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的实现中并非如此。