【问题标题】:How to use rownum in querydsl如何在querydsl中使用rownum
【发布时间】:2020-07-21 19:47:00
【问题描述】:

上述情况下如何使用rownum?

数据库:Mysql

【问题讨论】:

标签: mysql querydsl


【解决方案1】:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2021-07-31
    • 2014-11-02
    • 2022-07-13
    相关资源
    最近更新 更多