如何使用IN进行命名查询实际起作用?

Cos*_*min 3 collections jboss hibernate jpa-2.0

class X {
Y y; // manyToOne
}
class Y {
Long id;
}
Run Code Online (Sandbox Code Playgroud)


@NamedQuery(name = "someName", query = "from X where y.id in :ids")
Run Code Online (Sandbox Code Playgroud)

我在实体上有公共的,表格的,实体的以及所有其他内容,但是我没有在这里写下。

TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter("ids", someListOfLongs); // HERE I GET THE ERROR
queryFinal.getResultList();
Run Code Online (Sandbox Code Playgroud)


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

Arj*_*jms 5

我也使用了JBoss AS 6和这个确切的构造,但是它确实有效。

这是查询的示例:

<named-query name="Item.getByItemIDs">
    <query>
        SELECT
            i
        FROM
            Item i
        WHERE
            i.ID in (:itemsIDs)
    </query>
</named-query>
Run Code Online (Sandbox Code Playgroud)

和使用它的类:

@Override
public List<Item> getByItemIDs(List<Long> itemIDs) {
    return entityManager.createNamedQuery("Item.getByItemIDs", Item.class)
                        .setParameter("itemIDs", itemIDs)
                        .getResultList();
}
Run Code Online (Sandbox Code Playgroud)

如您的例外所示[[Ljava.lang.Object;@90d0bf](这是一个Object []),也许您应该像我的示例中那样尝试List <Long>?

(ps,您可以使用JPA的Fluid API使您的代码更简洁一些)