如何使用窗口函数编写查询并选择QueryDSL中的所有字段?在文档中有这样一个例子:
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来完成呢?
发布于 2015-06-14 08:48:29
JPAQuery只支持JPQL的表达式性,因此不支持窗口函数,但是分页应该使用
query.from(employee).orderBy(employee.id).limit(1)如果您需要使用窗口函数,并且需要employee.name和employee.id out,那么这个应该可以工作。
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();发布于 2017-05-16 08:54:30
正如@timo窗口函数( row_number)所写的那样,JPQL (JPA2.1版本)和JPAQuery (QueryDsl JPA4.1.4)不支持它。
但是,您可以重写查询,这样就不会使用秩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这是JPAQuery支持的,可能是这样的。
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);https://stackoverflow.com/questions/30797892
复制相似问题