JPA - 在IN运算符中使用长数组会抛出强制转换异常

时间:2012-05-21 09:33:23

标签: hibernate jpa jpa-2.0 jpql

我是JPA的新手并且能够快速获得它,我一直在查询中使用“IN”运算符尝试选择查询,并且已将错误视为关闭。我所做的是,我从函数中获取一系列(长)消息ID,并使用它来根据这些ID选择记录。这是我的查询

select t from MessageTable t where t.messageId IN (:id)  
query.setParameter("id", id);

我刚刚向您展示了部分代码,实体messageId很长,在Oracle DB中它的编号。当我尝试尽可能长的变量时它工作,当我传递长数组时它似乎不起作用。如果有人遇到这样的问题,可以帮助一些人。这是错误

  

14:24:49,428 INFO [LongType]无法绑定值'[J @ 14f76da'到   参数:1; [J不能转换为java.lang.Long

2 个答案:

答案 0 :(得分:7)

当你想要检查长/长时,数组Long[]long[]不是IN的有效参数类型 - 只有以下是:

  • Long
  • long
  • Collection<Long>(collection_valued_input_parameter)

如果您想坚持使用JPA而不使用Kshitij建议的org.Hibernate.Query.setParameterList,则必须将您的参数转换为Collections<Long>

转换很容易,可以自己滚动,也可以借助ArrayUtil

long[] id = {1L, 2L};
Long[] longs = ArrayUtils.toObject(id);
Collection<Long> list = Arrays.asList(longs);

答案 1 :(得分:2)

试试这个:

query.setParameterList("id", ids);