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

我知道如何使用DetachedCriteria 在WHERE子句中创建子查询,但是如您所见,我需要在子句中创建子查询FROM。如果不可能,也许有办法将它写在SELECT子句(内部SUM())中,因为这个查询可以重写为这种形式。

即使我必须将本机 SQL 传递给查询,我也确实需要使用 Criteria API。

我没有向您展示类或映射,但正如您所见,这是一个非常简单的示例。

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 and mapping 类中创建了一个属性:

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

当然可以设置懒惰。

我现在很确定,这也可以以不同的方式完成——通过在SELECT子句中进行子查询——在formula属性映射中使用属性/元素,但这会比子查询中的子查询慢FROM

当然,所有这些都在 Hibernate 的文档中;)

于 2009-10-14T13:21:11.390 回答