0

私は2つのテーブルを持っています:

    orders: id
    items: id, orderId, total, flag

Hibernate Criteria(DetachedCriteria)を使用して次のクエリを実行したいと思います。

    SELECT
        o.id,
        SUM(i1.total),
        SUM(i2.total)
    FROM
        orders o
            LEFT JOIN
            (
                SELECT
                    i.orderId as orderId,
                    SUM(i.total) as total
                FROM
                    items i
               WHERE
                    i.flag = 0
               GROUP BY
                    orderId
           ) AS i1
           ON i1.orderId = o.id
            LEFT JOIN
           (
               SELECT
                i.orderId as orderId,
                  SUM(i.total) as total
                FROM
                   items i
               WHERE
                   i.flag = 1
               GROUP BY
                    orderId
            ) AS i2
            ON i2.orderId = o.id
    GROUP BY
        o.id

DetachedCriteriを使用してサブクエリin句を作成する方法を知ってWHEREいますが、ご覧のとおり、サブクエリin句を実行する必要がありますFROM。それが不可能な場合は、このクエリをそのような形式に書き換えることができるため、SELECT(内部の)句に書き込む方法があるかもしれません。SUM()

ネイティブSQLをクエリに渡す必要がある場合でも、CriteriaAPIを使用する必要があります。

クラスやマッピングは示しませんでしたが、ご覧のとおり、これは非常に単純な例です。

4

1 に答える 1

0

私は自分の問題の解決策を見つけました。POJOとマッピングを作成する必要がありました:

<class name="OrderTotal"
    entity-name="OrderTotalForFlag0">
    <subselect>
        SELECT
            i.orderId AS id,
            SUM(i.total) AS total
        FROM
            items i
        WHERE
            i.flag = 0
        GROUP BY
            id
    </subselect>
    <id name="id" type="int" />
    <property name="total" type="int" />
</class>

そしてもちろん、フラグ1の場合も同様です。これは、データベースでビューを宣言し、そのビューへのマッピングを作成することによっても実行できます。この例では、同じPOJOクラスを使用していましたが、エンティティ名が異なります。

次に、クラスOrderとmappingでプロパティを作成しました。

<one-to-one name="orderTotalForFlag0" entity-name="OrderTotalForFlag0" />
<one-to-one name="orderTotalForFlag1" entity-name="OrderTotalForFlag1" />

もちろん怠惰を設定することもできます。

プロパティのマッピングで属性/要素SELECTを使用して、これを別の方法で(句でサブクエリを作成することによって)行うこともできると確信していますが、これは句でのサブクエリよりも動作が遅くなります。formulaFROM

そしてもちろん、そのすべてがHibernateのドキュメントに含まれていました;)

于 2009-10-14T13:21:11.390 に答える