Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDSL窗口函数_Java_Jpa_Querydsl - Fatal编程技术网

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

如何使用窗口函数并选择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实现吗?

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