gpt4 book ai didi

hql - row_number() 在 hql 中的分区上

转载 作者:行者123 更新时间:2023-12-04 20:08:16 31 4
gpt4 key购买 nike

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 .

最佳答案

据我所知你不能使用 row_number()既不在 HQL也不在 JPQL .我建议使用 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);
}

如果您曾经尝试使用 OVER()在 HQL 中,您几乎肯定会得到一些验证异常,例如 java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: OVER near line 1, column 42 ...

关于hql - row_number() 在 hql 中的分区上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778039/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com