Hibernate DetachedCriteria в предложении FROM

У меня 2 таблицы:

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

Я хотел бы сделать следующий запрос, используя критерии гибернации (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()), потому что этот запрос можно переписать в такую ​​форму.

Мне действительно нужно использовать Criteria API, даже если мне нужно передать в запрос собственный SQL.

Я не показывал вам классы или отображение, но, как видите, это очень простой пример.


person prostynick    schedule 14.10.2009    source источник
comment
Вы не показали нам классы или сопоставление, но API критериев выражен в терминах объектной модели, а не SQL.   -  person skaffman    schedule 14.10.2009
comment
Да, я уже сказал это. Этот пример настолько прост, что я не думаю, что здесь нужны классы или сопоставление, потому что, возможно, мою проблему нельзя решить с помощью Criteria API.   -  person prostynick    schedule 14.10.2009
comment
Вы пробовали использовать для этого проекции? Добавление сопоставления и классов всегда помогает проверить подсказку перед публикацией.   -  person zoidbeck    schedule 14.10.2009
comment
@prostynick: я хочу сказать, как мы можем посоветовать вам, как запрашивать объектную модель, если мы не знаем, как она выглядит? Множественные внешние соединения, агрегации и подзапросы не упрощают обратный инжиниринг.   -  person skaffman    schedule 14.10.2009


Ответы (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;)

person prostynick    schedule 14.10.2009