【发布时间】:2020-07-21 19:47:00
【问题描述】:
上述情况下如何使用rownum?
数据库:Mysql
【问题讨论】:
上述情况下如何使用rownum?
数据库:Mysql
【问题讨论】:
SqlExpressions.rowNumber() 返回一个ROW_NUMBER() 表达式。请记住,这仅适用于 querydsl-sql 而不适用于 querydsl-jpa,因为 JPQL(JPA 的查询语言)本身不支持窗口函数(专有的 JPQL 扩展如 Hibernates HQL 也是如此)。
为了在 JPA 查询中使用 ROW_NUMBER,必须为您的 ORM 提供程序注册一个自定义函数。您可以使用custom functions 自己注册这些函数。
注册自定义函数后,您仍需扩展 JPQLTemplates 以包含自定义窗口函数的模板。
你会这样做:
public class MyTemplates extends JPQLTemplates {
public MyTemplates() {
add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
}
}
然后按如下方式使用:
new JPAQuery(entityManager, new MyTemplates()).from(entity).select(rowNumber())
但是,由于中间有 Spring 集成,我认为模板更难以绑定到查询。
或者,您可以查看blaze-persistence-querydsl 扩展,它对 JPQL 的窗口函数(和许多其他功能)提供开箱即用的支持。例如:
QCat cat = QCat.cat;
BlazeJPAQuery<Tuple> query = new BlazeJPAQuery<Tuple>(entityManager, criteriaBuilderFactory).from(cat)
.select(cat.name, JPQLNextExpressions.rowNumber(), JPQLNextExpressions.lastValue(cat.name).over().partitionBy(cat.id));
List<Tuple> fetch = query.fetch();
【讨论】: