class X {
Y y; // manyToOne
}
class Y {
Long id;
}
@NamedQuery(name = "someName", query = "from X where y.id in :ids")
我在实体上有公共,表格,实体和所有其他内容,但我没有在这里写过。
TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter("ids", someListOfLongs); // HERE I GET THE ERROR
queryFinal.getResultList();
Parameter value [[Ljava.lang.Object;@90d0bf] was not matching type [java.lang.Long]
我尝试使用或不使用(),我将Hibernate-Core的版本更改为3.6.4(来自JBoss 6.0.0.Final),否则如果我在没有()的情况下编写in :ids
我会得到一个错误。
请帮助。
The IN always worked, the problem was that List<Long> wasn't actually List<Long> was List<Object[]>. Thanks
答案 0 :(得分:4)
我也使用JBoss AS 6和这个确切的构造,但它只是起作用。
这是一个查询示例:
<named-query name="Item.getByItemIDs">
<query>
SELECT
i
FROM
Item i
WHERE
i.ID in (:itemsIDs)
</query>
</named-query>
使用它的课程:
@Override
public List<Item> getByItemIDs(List<Long> itemIDs) {
return entityManager.createNamedQuery("Item.getByItemIDs", Item.class)
.setParameter("itemIDs", itemIDs)
.getResultList();
}
由于您的例外情况显示为[[Ljava.lang.Object;@90d0bf]
(这是一个Object []),您可以尝试使用List&lt; Long&gt;在我的例子中?
(p.s。您可以使用JPA的流体API使您的代码更简洁一些)
答案 1 :(得分:1)
hibernate中的'IN'子句非常,非常棘手,而且据我记得,命名参数不能很好地运行,但它确实与位置有关参数。
尝试将查询更改为此
@NamedQuery(name = "someName", query = "select x from X x where x.y.id in (?)")
以及使用它的代码
TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter(1, someListOfLongs); // I can't remember if the position is 0 or 1 based.
queryFinal.getResultList();
我应该补充一点,如果列表是emtpy,你会得到一个例外。在我们的代码中,我们检测到这种情况并用包含“-1”的列表替换空列表,因为所有ID都是正数,所以我们不会得到任何结果。