web-dev-qa-db-ja.com

3つのテーブルのHQLで左結合を使用する

3つのテーブルA BとCがあります。次に、このSQLクエリをHQLで実行します。

select * from A as a 
left join 
B as b 
on 
a.id = b.id 
left join 
C as c 
on 
b.type=c.type;

同等のHQLの作成に助けが必要です。このHQLを試してみました...

Query q = session.createQuery(
    "FROM A as a 
     LEFT JOIN 
     B as b 
     on 
     a.id=b.id 
     LEFT JOIN 
     C as c 
     on 
     b.type=c.type");

このクエリは例外をスローしています.....

org.hibernate.hql.ast.QuerySyntaxError:予期しないトークン:行1、列23の近くにLEFT [F.com.admin.AはLEFT JOIN B as b、a.Id = b.Id LEFT JOIN C as c where b。 type = c.type] org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.Java:74)at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.Java:214)at org.hibernate.hql .ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:127)(org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:83)(org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.Java:414))

また、 "with"句と "on"句を使用して、代わりに "on"または "with"で同じ予期しないトークンを取得しました。

例外qith ON .....

org.hibernate.hql.ast.QuerySyntaxError:予期しないトークン:行1、列41付近でON [com.admin.Aから左結合Bとしてb。a.Id = b.Id左結合Cとしてc onb.type = c.type] org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.Java:74)at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.Java:214)at org.hibernate.hql。 ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:127)(org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:83)at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.Java:414)

私はまた、代わりに「with」句を試してみました...同じ予期しないトークンが「または」で取得されます

例外qith WITH .....

org.hibernate.hql.ast.QuerySyntaxError:予期しないトークン:行1、列41付近でON [com.admin.Aから左結合Bとしてb。a.Id = b.Id左結合Cとしてc onb.type = c.type] org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.Java:74)at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.Java:214)at org.hibernate.hql。 ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:127)(org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:83)at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.Java:414)

助けてください。

11
Asuthosh Sharma

構成で必要なすべての関連付けをすでに定義していると思います。その場合、HQLでは次のようになります。

from A as a left join a.B as b left join b.C as c 

HQLには「ON」ステートメントはありません。Hibernateは、マッピングと定義された関連付けに基づいて自動的に行います。

a.Bおよびb.Cに注意してください。

すでに定義されているエイリアスa&cに基づいてBおよびCを参照します。

18
Sergii Shevchyk

このクエリを使用

from A as a
left join fetch a.B as b 
left join fetch b.C as c 
7
xrcwrn