Java QueryDSL窗口函数
如何使用窗口函数并选择QueryDSL中的所有字段编写查询? 文档中有这样一个示例:Java QueryDSL窗口函数,java,jpa,querydsl,Java,Jpa,Querydsl,如何使用窗口函数并选择QueryDSL中的所有字段编写查询? 文档中有这样一个示例: query.from(employee) .list(SQLExpressions.rowNumber() .over() .partitionBy(employee.name) .orderBy(employee.id)); 但我需要生成如下查询: SELECT * FROM (SELECT employee.name, employee.id, row_number()
query.from(employee)
.list(SQLExpressions.rowNumber()
.over()
.partitionBy(employee.name)
.orderBy(employee.id));
但我需要生成如下查询:
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实现吗?JPAQuery只支持JPQL的表达能力,因此不支持窗口函数,但分页应该使用
query.from(employee).orderBy(employee.id).limit(1)
如果您需要使用窗口函数,并且需要employee.name和employee.id,那么这应该是可行的
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();
正如@timo Window functions rank所写,JPQL JPA 2.1版本不支持行号,因此JPAQuery QueryDsl JPA 4.1.4也不支持行号
但是,您可以重写查询,使其不使用排名:
从员工a中选择一个*
哪里
从员工b中选择计数*
哪里
a、 部门=b.部门和
a、 工资以及如何使用SQLQuery?对于SQLQuery,最好也这样做,因为限制/偏移处理在内部映射到SQL引擎提供的分页功能。好的,谢谢。实际上,在我的代码中,我需要的是秩而不是行数,所以限制不起作用。有没有一种方法可以生成像我发布的那样的查询?我也在寻找完全相同的功能,QueryDSL页面中提供的示例没有太大帮助:对于JPAQuery,我得到的错误类似于类型JPAQueryBase中的EntityPath方法不适用于此实现的参数SimpleExpression。附近有工作吗?
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);