代码之家  ›  专栏  ›  技术社区  ›  prostynick

在FROM子句中休眠DetachedCriteria

  •  0
  • prostynick  · 技术社区  · 17 年前

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

    我想使用Hibernate条件(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 在中创建子查询的方法 WHERE FROM 条款如果这是不可能的,也许有一种方法可以把它写下来 SELECT 第条(内) SUM() ),因为此查询可以重写为这样的形式。

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

    1 回复  |  直到 17 年前
        1
  •  0
  •   prostynick    17 年前

    我找到了解决问题的办法。我必须做一个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>
    

    当然,对于flag 1,情况也会类似。这也可以通过在数据库中声明视图并创建到该视图的映射来实现。在本例中,我使用了相同的POJO类,但实体名称不同。

    然后我按照类顺序和映射创建了一个属性:

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

    当然,懒惰是可以设定的。

    SELECT 条款-使用 formula 属性映射中的属性/元素,但这比 FROM 条款