【问题标题】:How to inner join a derived table with Hibernate/NHibernate?如何使用 Hibernate/NHibernate 内部连接派生表?
【发布时间】:2011-11-23 16:16:46
【问题描述】:

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

我正在根据销售数据创建报告,需要输出一些聚合值以及一些非聚合/非分组值,例如名称。

这是我想要输出的:

具有 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 做到这一点?

【问题讨论】:

    标签: hibernate nhibernate hql criteria


    【解决方案1】:

    如果您使用类似这样的精美 SQL,只需使用本机查询:

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

    【讨论】:

      【解决方案2】:

      在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。

      【讨论】:

      • 你是对的,它是一个 ORM。如果我可以使用现有的映射作为基础而不是在普通 SQL 中重新发明它们,那只会变得容易得多。..
      • 我不是故意粗鲁的,但我的英语不是很好。问候!
      猜你喜欢
      • 2023-03-05
      • 2014-12-28
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多