如何使用Hibernate / NHibernate内部连接派生表?

时间:2011-09-23 13:15:43

标签: hibernate nhibernate hql criteria

(首先我要道歉,如果这是重复的话,我找不到任何好的解决方案,即使它必须简单)

我正在根据销售数据创建报表,需要输出一些汇总值以及一些非聚合/非聚合值,例如Name。

这是我要输出的内容:

具有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 个答案:

答案 0 :(得分:1)

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) {
        // ...
    }
}

答案 1 :(得分:0)

如果您正在使用这种花哨的SQL,只需使用本机查询:

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