2012-04-18 74 views
1

我是新來的這個。請幫幫我。我不能在冬眠hql查詢中的兩個表之間進行內部聯接

我內心的加入看起來像這樣: select p.idprodus, p.denumire, p.cantitate from Produs p inner join Furnizor f on p.idfurn = f.idfurn

我想要在列idfurn內加盟,但是我得到這些錯誤:

org.hibernate.QueryException:外或全加盟絕應遵循的路徑表達式select p.idprodus, p.denumire, p.cantitate from sakila.entity.Produs p inner join Furnizor f on p.idfurn = f.idfurn

at org.hibernate.hql.classic.FromParser.token(FromParser.java:170) 
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86) 
at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108) 
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216) 
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) 

回答

3

在HQL,您使用的實體,而不是表。實體通過關聯(OneToOne,OneToMany等)鏈接在一起。連接可以在關聯實體之間完成。

例如,如果您有產品和供應商之間的多對一的關聯,HQL查詢是:

select p from Product p inner join p.provider provider where ... 

ON子句是不必要的,因爲Hibernate從多對一關聯的映射,一個產品是知道與使用provider.id_provider主鍵的product.id_provider外鍵的提供程序相關聯。

所有這些在Hibernate documentation中都有很好的解釋。

+0

我不明白你爲什麼在HQL查詢中寫了p.provider,爲什麼你寫了那個p?對不起,我是初學者,在理解這方面我有一些小問題。 – alin 2012-04-19 20:38:40

+0

例如,我想打印實體產品中的所有列,並且當我嘗試使用來自Product的查詢時,實體中外鍵的列不顯示它們包含的信息。它似乎sakila.entity.HistoryProduct \t sakila.entity.Provider \t sakila.entity.Category而不是值。請給我一些建議。萬分感謝! – alin 2012-04-19 21:03:08

+0

我沒有你的代碼,我沒有魔術水晶球,所以我不可能評論它。但我認爲你只是錯過了Hibernate的一大部分:實體之間的關聯。閱讀文檔。我寫了p.provider,因爲產品有一個提供者。在Java中,我會調用'p.getProvider()'。在HQL中,我編寫了p.provider。 – 2012-04-21 06:27:49

0

如果關聯(例如OneToMany映射)不存在,並且您需要內連接,請使用舊的cross join notation