Leo*_*nel 5 java hibernate row-number querydsl spring-data
我正在使用查询dsl和spring数据.
环境:
<querydsl-apt.version>4.1.4</querydsl-apt.version>
<querydsl-jpa.version>4.1.4</querydsl-jpa.version>
<querydsl-sql.version>4.1.4</querydsl-sql.version>
<spring>4.3.3.RELEASE</spring>
Run Code Online (Sandbox Code Playgroud)
查询:
JPAQueryFactory query = new JPAQueryFactory(getEntityManager());
SimpleExpression<Long> rowNumber = SQLExpressions.rowNumber()
.over()
.orderBy(qServiceExecution.updatedAt.asc()).as("rowNumber");
List<Tuple> response = query.select(qServiceExecution.id, SQLExpressions.rowNumber()
.over()
.orderBy(qServiceExecution.updatedAt.asc()))
.from(qServiceExecution)
.fetch();
Run Code Online (Sandbox Code Playgroud)
例外:
Root cause: java.lang.IllegalArgumentException: No pattern found for ROWNUMBER
at com.querydsl.core.support.SerializerBase.visitOperation(SerializerBase.java:280) ~[querydsl-core-4.1.4.jar:na]
at com.querydsl.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:437) ~[querydsl-jpa-4.1.4.jar:na]
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:231) ~[querydsl-core-4.1.4.jar:na]
at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:31) ~[querydsl-core-4.1.4.jar:na]
Spring error: No pattern found for ROWNUMBER; nested exception is java.lang.IllegalArgumentException: No pattern found for ROWNUMBER
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:384) ~[spring-orm-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246) ~[spring-orm-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:491) ~[spring-orm-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) ~[spring-tx-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[spring-tx-4.3.3.RELEASE.jar:4.3.3.RELEASE]
Run Code Online (Sandbox Code Playgroud)
查询DSL文档:http://www.querydsl.com/static/querydsl/latest/reference/html/ch02s03.html#d0e1276
其他堆栈溢出问题:QueryDSL窗口函数
有什么建议吗?
窗口函数不包含在 JPQL 规范中,因此在任何 JPA 实现中都不可用。您可以使用自定义函数自行注册这些函数。
然而,在此之后,这些功能仍然无法在 QueryDSL 中访问。您正在从这里窃取SQLExpressions以获得窗口表达式。这些方法存在SQLExpressions是有原因的:它们只能与一起工作querydsl-sql,不能与一起工作querydsl-jpa(同样,因为 JPA 本身不支持窗口函数)。因此,在注册自定义函数后,您仍然需要扩展JPQLTemplates以包含自定义窗口函数的模板。
你会这样做:
public class MyTemplates extends JPQLTemplates {
public MyTemplates() {
add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它如下:
public class MyTemplates extends JPQLTemplates {
public MyTemplates() {
add(SQLOps.ROWNUMBER, "ROW_NUMBER({0})");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,由于中间有 Spring 集成,我认为模板更难以绑定到查询。
或者,您可以查看该blaze-persistence-querydsl扩展,它对 JPQL 的窗口函数(以及许多其他功能)提供开箱即用的支持。例如:
new JPAQuery(entityManager, new MyTemplates()).from(entity).select(rowNumber())
Run Code Online (Sandbox Code Playgroud)