【问题标题】:Hibernate DetachedCriteria in FROM clauseFROM 子句中的 Hibernate DetachedCriteria
【发布时间】:2009-10-14 07:39:00
【问题描述】:

我有 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。

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

【问题讨论】:

  • 您没有向我们展示类或映射,但 Criteria API 是根据对象模型而不是 SQL 来表示的。
  • 是的,我已经说过了。这个例子很简单,我认为这里不需要类或映射,因为也许我的问题无法使用 Criteria API 解决。
  • 您是否尝试过为此使用投影?添加映射和类总是有助于在发布前检查提示。
  • @prostynick:我的观点是,当我们不知道对象模型是什么样子时,我们如何建议您如何查询对象模型?多个外连接、聚合和子查询不利于逆向工程。

标签: java sql hibernate criteria


【解决方案1】:

我找到了解决问题的方法。我必须做一个 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类和映射中做了一个属性:

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

当然可以设置惰性。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2013-08-26
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多