4

私はHQLでそのようなことをしたい:

SELECT *
FROM tableA a
INNER JOIN (select fieldA, sum(fieldB) as sum from tableB) b
ON a.fieldA = b.fieldA and a.fieldC = b.sum;

しかし、これはエラーになります:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: (...

HQL と Hibernate を使用してこれを行う方法はありますか?

4

3 に答える 3

7

ネイティブ SQLソリューション アプローチを試してください。

最初にこれをインポートする必要があります:

import org.hibernate.SQLQuery;

次に、コードのどこかに:

SQLQuery query = session.createSQLQuery(
    "SELECT * FROM tableA a
    INNER JOIN 
    (SELECT fieldA, sum(fieldB) as sum from tableB) b
    ON a.fieldA = b.fieldA and a.fieldC = b.sum"
);

詳細はこのリンク
とこちら (Hibernate Query Language で結合)

于 2012-08-02T12:17:54.883 に答える
4

あなたはHQLでそのようなことを試みることができます:

String sqlText = 
        "select entityA 
         from EntityA entityA, EntityB entityB 
         where entityA.fieldA=entityB.fieldA 
         and entityA.fieldC=(select sum(entityB.fieldB) 
                             from EntityB entityB 
                             where entityB.fieldA=entityA.fieldA)"

Query query = session.createQuery(sqlText);

SQLと同様に機能するはずです。あなたの声明について - 私が知っているように、オブジェクト指向であるため、HQL で内部ビューを使用することはできません。

これは、HQL での結合に関する良い記事です。

編集:

上記のuser1495181からのメモによると、クエリは次のように書き換えることができます(ただし、よくわかりません):

String sqlText = 
        "select entityA 
         from EntityA entityA
         join entityA.entitiesB entityB
         Where entityA.fieldC=(select sum(entityB.fieldB) 
                             from EntityB entityB 
                             where entityB.fieldA=entityA.fieldA)"

しかし、私にとってはより理解しやすいため、最初のバリアントを好みます(特にネイティブSQLを使用していた人々にとって)。

于 2012-08-02T12:58:55.090 に答える
1

on キーワードで結合を定義することはできません。Hibernate は、マッピングに基づいて結合を行う方法を知っています。a と b の間のマッピングで関係を定義すると、hibernate は定義した関係に基づいて結合を行います。a と b の間に関係がある場合は、on を使用せずに内部結合を実行し、結合基準を where 句に入れます。

于 2012-08-02T12:58:00.340 に答える