13

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

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:予期しないトークン:LEFT 1行目、23列目[FROM com.admin.A as a LEFT JOIN B as b where a.Id = b.Id LEFT JOIN C as cwhereb。 type = c.type] at 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)at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

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

例外qithON....。

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

また、whereの代わりに"with"句を試してみました...同じ予期しないトークンをonまたは"with"で取得します

例外qithWITH....。

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

助けてください。

4

2 に答える 2

21

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

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

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

aBbCに注意してください。

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

于 2012-10-01T07:26:44.580 に答える
8

このクエリを使用

from A as a
left join fetch a.B as b 
left join fetch b.C as c 
于 2014-02-24T06:04:48.137 に答える