2014-04-01 97 views
4

分區什麼是ROW_NUMBER()的HQL 相當於在分區我在HQL以下查詢:ROW_NUMBER()在上HQL

select s.Companyname, p.Productname, sum(od.Unitprice * od.Quantity - od.Discount) as SalesAmount FROM OrderDetails as od inner join od.Orders as o inner join od.Products as p " + 
                   "inner join p.Suppliers as s" + 
                 " where o.Orderdate between '2010/01/01' and '2014/01/01' GROUP BY s.Companyname,p.Productname" 

我想s.Companyname其中RowNumber <= n做分區。通過partiotion

回答

0

行號看起來是這樣的:

row_number() over (partition by s.Companyname) 

不能where子句中使用窗口函數row_number,所以你要做的子查詢與過濾器由它的價值:

select * from (
    -- here is your query 
    select 
    ..., 
    row_number() over (partition by s.Companyname) as rowNum 
    from ... 
    where ... 
) as res 
where rowNum <= n 
0

由於據我所知,你不能在HQLJPQL之間使用row_number()。我建議使用一個native SQL查詢在這種情況下:

@PersistenceContext 
protected EntityManager entityManager; 
... 

    String sQuery = "SELECT q.* FROM (" + 
      "SELECT s.company_name, " + 
       "p.product_name, " + 
       "sum(od.unit_price * od.quantity - od.discount) as SalesAmount, " + 
       "row_number() OVER (partition by s.company_name) as rn " + 
      "FROM OrderDetails od " + 
      "INNER JOIN Orders o ON o.id = od.order_id " + 
      "INNER JOIN Products p ON p.id = od.product_id " + 
      "INNER JOIN Suppliers s ON s.id = p.supplier_id " + 
      "WHERE o.order_date between '2010/01/01' and '2014/01/01') as q " + 
     "WHERE rn <= :n"; 

    List<ResultDbo> results = new ArrayList<>(); 
    Query query = entityManager.createNativeQuery(sQuery); 
    query.setParameter("n", n); 
    List<Object[]> resultSet = query.getResultList(); 
    for (Object[] resultItem : resultSet) { 
     ResultDbo result = new ResultDbo(); 
     result.setCompanyName((String) resultItem[0]); 
     result.setProductName((String) resultItem[1]); 
     result.setSalesAmount((String) resultItem[2]); 
     results.add(result); 
    } 

如果你曾經嘗試在HQL使用OVER()你幾乎肯定會獲得一個類似java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: OVER near line 1, column 42 ...

一些驗證異常