2011-06-15 71 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