首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryDSL窗口函数

QueryDSL窗口函数
EN

Stack Overflow用户
提问于 2015-06-12 07:46:32
回答 2查看 6.7K关注 0票数 10

如何使用窗口函数编写查询并选择QueryDSL中的所有字段?在文档中有这样一个例子:

代码语言:javascript
复制
query.from(employee)
.list(SQLExpressions.rowNumber()
    .over()
    .partitionBy(employee.name)
    .orderBy(employee.id));

但我需要生成这样的查询:

代码语言:javascript
复制
SELECT * FROM 
  (SELECT employee.name, employee.id, row_number() 
    over(partition BY employee.name
    ORDER BY employee.id)
  FROM employee) AS sub
WHERE row_number = 1

是否可以用JPAQuery来完成呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-14 08:48:29

JPAQuery只支持JPQL的表达式性,因此不支持窗口函数,但是分页应该使用

代码语言:javascript
复制
query.from(employee).orderBy(employee.id).limit(1)

如果您需要使用窗口函数,并且需要employee.name和employee.id out,那么这个应该可以工作。

代码语言:javascript
复制
NumberExpression<Long> rowNumber = SQLExpressions.rowNumber()
    .over()
    .partitionBy(employee.name)
    .orderBy(employee.id).as("rowNumber");

query.select(employee.name, employee.id)
    .from(SQLExpressions.select(employee.name, employee.id, rowNumber)
                        .from(employee).as(employee))
    .where(Expressions.numberPath(Long.class, "rowNumber").eq(1L))
    .fetch();
票数 14
EN

Stack Overflow用户

发布于 2017-05-16 08:54:30

正如@timo窗口函数( row_number)所写的那样,JPQL (JPA2.1版本)和JPAQuery (QueryDsl JPA4.1.4)不支持它。

但是,您可以重写查询,这样就不会使用秩over():

代码语言:javascript
复制
select a.* from employees a
where
(
    select count(*) from employees b
    where 
       a.department = b.department and
       a.salary <= b.salary
) <= 10
order by salary DESC

这是JPAQuery支持的,可能是这样的。

代码语言:javascript
复制
final BooleanBuilder rankFilterBuilder = 
    new BooleanBuilder(employee.department.eq(employee2.department));
rankFilterBuilder.and(employee.salary.loe(employee2.salary));

query.from(employee)
.where(JPAExpressions.selectFrom(employee2)
            .where(rankFilterBuilder)
            .select(employee2.count())
            .loe(10))
.orderBy(employee.salary);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30797892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档