2011-04-07 103 views
1

好的,我已經使用雙向@ManyToMany關係與註釋映射了兩個表。休眠:只查找那些不是多對多關係的行

現在我只想返回不是多對多關係的元素,我試圖使用here中的代碼,但它在運行時引發異常。 這裏的HQL:

String hql = "select a from Article a " + 
       "left join a.tags t " + 
       "group by a " + 
       "having count(t)=0"; 

有沒有更好的方式來返回這些元素?或者修復這個查詢中的錯誤?

現在拋出的例外是:

column "article0_.id" must appear in the GROUP BY clause or be used in an aggregate function 

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL ... 
+0

你能提供SQL訪問DB時休眠產生?它似乎試圖讓所有的字段進行映射,但只有其中一個被包含在'group by'條件中。 – Donz 2011-04-07 07:34:57

+0

@Donz,我會嘗試提取它,同時嘗試這些建議。 – 2011-04-07 12:45:05

回答

2

查詢是正確的,但在某些數據庫group by a是不夠的,你必須enoberate a的所有屬性,如group by a.id, a.title

或者,你可以使用下面的查詢:

select a from Article a where a.tags is empty 

參見:

+0

它的工作原理!但現在我在我的小組中擁有> 10個物業。另外,如果我改變模型中的某些東西,我必須在查詢中明確地進行更改。我可以做一些像。*一樣的東西嗎?要選擇所有屬性? – 2011-04-07 13:20:25

+0

@moondowner:使用'join' - 否,但是您的任務可以在沒有'join'的情況下解決,請參閱更新。 – axtavt 2011-04-07 14:17:57

1

不知道它是否會工作,但你可以試一試:

String hql = "select a from Article a " + 
       "where a.tags=null "; 
+0

我現在就試一試。 – 2011-04-07 12:45:43

+0

它不起作用,它返回:'錯誤:語法錯誤在或接近「。」' – 2011-04-07 12:50:13

+0

嗯!一種調試方式可以是:獲取由Hibernate生成的SQL,嘗試通過獨立的數據庫客戶端將該查詢直接執行到數據庫。看看你到那裏有什麼錯誤。嘗試修復SQL查詢。當你修好後,你將有更好的機會解決你的HQL問題。 – craftsman 2011-04-07 13:20:50