2011-05-03 32 views
2

我真的無法找到足夠的關於hibernate IN關鍵字的文檔,當應用於某個對象的集合內的搜索時。我有奇怪的問題,我有一個hql查詢:HQL搜索子內SET與IN關鍵字

FROM Contact co, IN (co.categories)categories WHERE categories.name = ? 

在我期待的課程聯繫人列表。但它有什麼不對,因爲它不是返回Contact對象的列表,而是Object []的列表?它是語法還是完全錯誤?

這裏正在映射部分:

 <set lazy="false" name="categories" table="ContactCategory"> 
     <key column="id" foreign-key="fk_contact_category" /> 
     <many-to-many class="Category" column="catid" 
      foreign-key="fk_contact_category2" /> 
    </set> 

    <class name="Category"> 

    <id column="catid" name="Id" type="long"> 
     <generator class="sequence" /> 
    </id> 
    <property length="50" name="name" type="string" /> 
</class> 

重要的是要提:這個查詢與查詢生成器製作。這是打印輸出生成的查詢失敗之一。非常奇怪的是 - 我得到這個列表中的對象的正確數量,我檢查數據庫和數字是正確的給定的參數,但我沒有得到聯繫對象,但在列表中的一些對象數組。

感謝所有幫助

+0

你能否描述一下你的域類和你想做什麼,因爲我相信你嘗試錯誤的方式。 – Ralph 2011-05-03 19:19:49

+0

@Ralph:我編輯過! – Julia 2011-05-03 19:29:56

回答

4

您需要添加SELECT co

,使您的查詢SELECT co FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

SELECT co是必要的,讓Hibernate哪一個項目應該每返回結果集行。到目前爲止條款 -


SELECT co FROM Contact co LEFT JOIN co.categories cat WHERE cat.name = ? 我只看到了在那裏的IN關鍵字。在這樣的東西,

FROM catagories cat WHERE cat.name IN ('HALLO', 'WORLD')

+0

檢查答案由高級https://forum.hibernate.org/viewtopic.php?p=2349920&sid=19afe0d70c2e3ac2b376ac05c9d8e5ce,好吧,似乎我可能會錯過AS關鍵字。將嘗試現在 – Julia 2011-05-03 19:37:57

+0

@Julia - 我已經添加了'SELECT co'的東西,可能它將足以將它添加到您的原始查詢 - 但這只是猜測。 – Ralph 2011-05-03 19:44:29

+0

我沒有接受你的答案,因爲這不是上述答案,而是你在評論中寫的東西。非常重要的是可以使用IN關鍵字而不是連接。如果你編輯你的答案(爲將來的人),並給這個SELECT的一些推理,id很高興投票:) – Julia 2011-05-04 10:44:33

1

我不喜歡回答我的問題,並沒有真正理解爲什麼這是SELECT neccessary,但是這可以作爲一個魅力。如果有人解釋我的推理,我會很樂意投他的答案。

**SELECT co** FROM Contact co, IN (co.categories)categories WHERE categories.name = ? 

謝謝大家

1

朱莉婭,嘗試打印每個對象的類別和值原始查詢的陣列像這樣:

List<Object[]> results = // code to fetch your query ; 
// just the first, or you can print every entry with a outer loop 
Object[] firstObject = results.get(0); 
for (Object o : firstObject) { 
    System.out.println(o.getClass() + " - " + o); 
} 

我的猜測是,Hibernate是推斷要麼一個Contact對象和一個單獨的Category列表,或者將查詢返回的列作爲原始包裝。無論如何,問題似乎是,Hibernate無法弄清楚你期望從DBMS返回的列列表中獲取什麼。在第二個查詢中,您將其縮小爲您想要的特定類型的別名,因此所有內容都按預期工作。

0

這Grails的2.1.4爲我工作的HQL

Task.executeQuery( 「從任務任務 選擇任務加入task.tags標籤,其中tag.name = '重複'」)

假設實體任務。groovy有

static hasMany = [tags: Tag]