2011-06-15 76 views
3
class X { 
Y y; // manyToOne 
} 
class Y { 
Long id; 
} 


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

@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的核心的版本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

回答

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 []),也许你应该尝试列表<长>在我的例子?

(PS可以使用JPA的流体API使你的代码有点不太详细)

+0

它不是对象[],它是列表。我不会在我的主要实体上的一个属性上进行操作,但是对于许多实体的实体,不知道它是否重要。 – 2011-06-15 19:55:50

+0

我认为我的问题是因为列表得到一个列表 ...我在Eclipse中设置了未检查的警告不会显示 – 2011-06-15 19:59:42

+1

IN始终工作,问题是列表不是实际列表是列表。谢谢 – 2011-06-15 20:09:52

1

休眠的“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(); 

而且我要补充的是,如果列表不能为空,你会得到一个异常的代码。在我们的代码中,我们检测到这种情况,并用包含'-1'的列表替换空列表,并且因为所有的id都是正数,所以我们没有得到任何结果。

+0

我仍然得到'造成的:java.lang.IllegalArgumentException异常:参数值[Ljava.lang.Object ; @ 5625ea]不匹配类型[java.lang.Long]' – 2011-06-15 19:49:12

+0

IN始终有效,问题是列表实际上不是列表是列表。谢谢 – 2011-06-15 20:09:44