Как внутреннее соединение производной таблицы с Hibernate / NHibernate? - PullRequest
3 голосов
/ 23 сентября 2011

(Сначала я хотел бы извиниться, если это дубликат, я не могу найти какое-либо хорошее решение для него, хотя оно должно быть простым)

Я создаюотчеты из продаж-данных и должны выводить некоторые агрегированные значения наряду с некоторыми неагрегированными / не сгруппированными, такими как Имя.

Это то, что я хотел бы вывести:

Общая прибыль на одного сотрудника с User.Name и SUM (Order.Profit), например:

Name         Profit [+ more aggregated columns]
-------------------
John Doe    | $250
James Smith | $130

Это довольно просто с простым SQL, например:

SELECT 
u.Name,
x.TotalProfit
FROM dbo.Users u
INNER JOIN (
    SELECT  o.UserID as UserID, 
    SUM(o.Profit) AS TotalProfit,
    --[..] more aggregated columns
    FROM Orders o
    GROUP BY o.UserID
) x  ON u.ID = x.ProfitToID

Я не хочу группировать по u.Name, так как это повлияет на производительность (подробнее о том, почему sqlteam.com )

Как мнесделать это с NHibernate?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

В Hibernate вы определяете пути соединения в отображениях. Таким образом, классы, не связанные в Java с другими классами, не могут объединяться. Hibernate - это ORM, в этом есть смысл.

Попробуйте создать SQLquery. Работает почти так же, как обычные запросы HQL.

Тогда вы получите массив с данными. Разберите его или создайте DTO с подходящим конструктором.

select a.b.MyDTO(u.Name, x.TotalProfit) from...

class MyDTO{
    String name;
    int totalProfit;
    public MyDTO(String name, int totalProfit) {
        // ...
    }
}

Udo.

0 голосов
/ 23 сентября 2011

Если вы используете такой причудливый SQL, просто используйте собственный запрос:

entityManager.createNativeQuery("your query here", SomeDTOClass.class);
...