2012-04-18 3 views
1

私はこれで初めてです。私を助けてください。hibernate hqlクエリで2つのテーブル間で内部結合を行うことができません

私の内部結合を以下のようになります。私は、内側の列idfurnに参加したいが、私はこれらのエラーを取得 select p.idprodus, p.denumire, p.cantitate from Produs p inner join Furnizor f on p.idfurn = f.idfurn

org.hibernate.QueryException:外側または必須に参加フルあなたは実体ではなく、テーブルを使用して、パス式HQLで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

が続きます。エンティティは関連(OneToOne、OneToManyなど)によってリンクされています。結合は関連エンティティ間で実行できます。

あなたが製品とプロバイダ間のManyToOne関連を持っている場合たとえば、HQLクエリは次のとおりです。Hibernateは製品であることをManyToOne協会のマッピングから知っているので、

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

句には、不要ですprovider.id_provider外部キーをprovider.id_provider主キーに使用して、そのプロバイダに関連付けられています。

このすべては、Hibernate documentationに多くの例をあげて非常によく説明されています。

+0

なぜ私はHQLクエリでp.providerを書いたのかわかりません、なぜあなたはそのpを書いたのですか?申し訳ありませんが、私は初心者です。私はこれを理解するのに少し問題があります。 – alin

+0

たとえば、エンティティProductからすべての列を印刷したいとします.Productからクエリを実行しようとすると、このエンティティの外部キーである列には情報が表示されません。 sakila.entity.HistoryProduct \t sakila.entity.Provider \t sakila.entity.Categoryの代わりに値が表示されます。私にいくつかの提案をお願いします。大いに感謝する! – alin

+0

私はあなたのコードを持っていないし、私は魔法のようなクリスタルボールを持っていないので、私はそれについてコメントすることは不可能です。しかし、私はあなたがHibernateの巨大な部分、つまりエンティティ間の関連付けを見逃したと思います。ドキュメントをお読みください。製品にプロバイダがあるため、私はp.providerを書きました。 Javaでは、私は 'p.getProvider()'を呼び出します。 HQLでは、p.providerを記述します。 –

0

アソシエーション(OneToManyマッピングなど)が存在せず、内部結合が必要な場合は、古いcross join notationを使用します。

関連する問題