如何使用IN实际工作的命名查询?

时间:2011-06-15 19:19:12

标签: hibernate collections jboss jpa-2.0

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

2 个答案:

答案 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都是正数,所以我们不会得到任何结果。