2009-10-14 4 views
0

У меня есть 2 таблицы:Hibernate DetachedCriteria в ЕКОМ

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 а для создания subquery в WHERE, но, как вы можете видеть, мне нужно сделать подзапрос в разделе FROM. Если это невозможно, возможно, есть способ записать его в SELECT (внутри SUM()), потому что этот запрос можно переписать в такую ​​форму.

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

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

+0

Вы не показали нам классы или отображение, но критерии API выражается в терминах объектной модели, а не SQL. – skaffman

+0

Да, я уже говорил это. Этот пример настолько прост, что я не думаю, что здесь нужны классы или сопоставление, потому что, может быть, моя проблема не может быть решена с помощью API критериев. – prostynick

+0

Вы пытались использовать прогнозы для этого? Добавление сопоставления и классов всегда помогает проверять подсказку перед публикацией. – zoidbeck

ответ

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, но другой сущ.

Тогда я сделал свойство в классе порядка и отображение:

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

конечно же лени может быть установлен.

Я довольно уверен сейчас, что это может быть также сделано по-другому - путем подзапрос в SELECT п - с помощью атрибута formula/элемент отображения для свойств, но это будет работать медленнее, чем вложенный запрос в FROM пункте.

И, конечно, все, что было в документации к Hibernate;)

Смежные вопросы