QueryDSL Window functions

前端 未结 2 447
清歌不尽
清歌不尽 2021-01-11 23:15

How can I write a query using window functions and selecting all fields in QueryDSL? In the docs there is an example like this:

query.from(employee)
.list(SQ         


        
2条回答
  •  佛祖请我去吃肉
    2021-01-12 00:15

    As written by @timo Window functions (rank, row_number) are not supported by JPQL (JPA 2.1 version) and hence by JPAQuery (QueryDsl Jpa 4.1.4).

    You can however rewrite your query so that is does not use rank over():

    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
    

    This is supported by JPAQuery, it probably goes like this.

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

提交回复
热议问题