Hibernate 如何在实际工作中进行命名查询?

Hibernate 如何在实际工作中进行命名查询?,hibernate,collections,jboss,jpa-2.0,Hibernate,Collections,Jboss,Jpa 2.0,我在实体上有public、table、entity和所有其他东西,但我没有在这里写它们 @NamedQuery(name = "someName", query = "from X where y.id in :ids") TypedQuery query=getEntityManager().createNamedQuery(“someName”,X.class); query.setParameter(“id”,someListOfLongs);//这里我得到了错误 queryFinal.


我在实体上有public、table、entity和所有其他东西,但我没有在这里写它们

@NamedQuery(name = "someName", query = "from X where y.id in :ids")
TypedQuery query=getEntityManager().createNamedQuery(“someName”,X.class);
query.setParameter(“id”,someListOfLongs);//这里我得到了错误
queryFinal.getResultList();

参数值[[Ljava.lang.Object;@90d0bf]与类型[java.lang.Long]不匹配。

我尝试使用或不使用(),我将Hibernate Core的版本更改为3.6.4(从JBoss 6.0.0.Final),否则,如果我在:ids中编写
而不使用(),我就会出错

请帮忙



IN总是有效的,问题是List实际上不是List而是List。谢谢

hibernate中的'IN'子句非常非常棘手,而且据我所知,它不适合命名参数,但适合位置参数

尝试将查询更改为此

TypedQuery<X> query = getEntityManager().createNamedQuery("someName", X.class);
query.setParameter("ids", someListOfLongs); // HERE I GET THE ERROR
queryFinal.getResultList();
以及使用它来

@NamedQuery(name = "someName", query = "select x from X x where x.y.id in (?)")
TypedQuery query=getEntityManager().createNamedQuery(“someName”,X.class);
setParameter(1,someListOfLongs);//我记不起位置是基于0还是基于1。
queryFinal.getResultList();

我应该补充一点,如果列表是emtpy,你会得到一个异常。在我们的代码中,我们检测到这种情况,并用一个包含“-1”的列表替换空列表,因为所有ID都是正数,所以我们不会得到任何结果。

我也使用JBoss AS 6和这个确切的构造,但它只是工作

这是一个查询示例:

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();

挑选
我
从…起
项目一
哪里
i、 中的ID(:itemsIDs)
以及使用它的类:

<named-query name="Item.getByItemIDs">
    <query>
        SELECT
            i
        FROM
            Item i
        WHERE
            i.ID in (:itemsIDs)
    </query>
</named-query>
@覆盖
公共列表GetByItemId(列表ItemId){
返回entityManager.createNamedQuery(“Item.getByItemId”,Item.class)
.setParameter(“itemIDs”,itemIDs)
.getResultList();
}
正如您的异常所指示的
[[Ljava.lang.Object;@90d0bf]
(这是一个对象[]),也许您应该像我的示例中那样尝试列表


(顺便说一句,你可以使用JPA的fluid API让你的代码不那么冗长)

我仍然得到
的原因是:java.lang.IllegalArgumentException:Parameter value[[Ljava.lang.Object;@5625ea]与类型[java.lang.Long]不匹配。
IN始终有效,问题是列表实际上不是列表。Thanksit's not Object[],这是列表。我不知道我的主实体上的属性,但在一个多个实体上,我不知道它是否重要。我想我的问题是列表得到了一个列表…我在Eclipse中设置了未选中的警告,不显示。在“始终工作”中,问题是列表实际上不是列表。谢谢
<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();
}