我试图使用QueryDSL计算平均日期差异。
我创建一个小项目是为了演示我试图以一种简化的方式完成的任务(真正的查询要复杂得多,包含大量的联接/ where / sort子句)。我们有一个带有客户字段的birthDate类,我们正在试图获得客户的平均年龄(以秒为单位)。我们也想要最大的年龄,但让我们关注这个帖子的平均年龄。
我尝试使用querydsl-jpa编写这个查询。,但由于一个模糊的错误,它失败了:
java.lang.NullPointerException
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.determineJdbcTypeCode(StandardAnsiSqlAggregationFunctions.java:106)
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$AvgFunction.render(StandardAnsiSqlAggregationFunctions.java:100)
at org.hibernate.hql.internal.ast.SqlGenerator.endFunctionTemplate(SqlGenerator.java:233)
[...]我还尝试了其他方法,比如使用NumberTemplate.create(Double.class, "{0} - {1}", DateExpression.currentDate(), customer.birthDate).avg(),但是它没有返回正确的值。如果我们想要得到一个以秒为单位的日期差异,那么我们似乎需要找到一些方法来调用特定于数据库的日期/时差函数,而不仅仅是使用减号。
遗憾的是,在JPQL中计算日期差异似乎是不可能的,所以我想querydsl也有局限性。因此,我们必须编写一个原生SQL查询,或者找到一些黑客让QueryDsl生成的JPQL调用一个本机数据库函数。
JPA2.1增加了对调用数据库函数的支持,但是有一个问题: MySQL函数采用TIMESTAMPDIFF(SECOND, '2012-06-06 13:13:55', '2012-06-06 15:20:18')形式。如果第一个参数(SECOND)是字符串,则可能是可能的,但它似乎是对某种常量的引用,而且使用第一个参数(未引用)生成JPQL似乎很复杂。
QueryDSL添加了对日期差异的支持,但是似乎大部分代码都驻留在querydsl项目中,所以我想知道我是否可以从querydsl中获益。
以下是我的问题:
Expressions.numberTemplate())?还是我们被迫使用querydsl?QCustomer和SCustomer?QCustomer目前是使用插件“com.mysema.maven:apt plugin”从客户实体生成的。如果我正确理解,我必须使用不同的插件 (com.querydsl:querydsl-maven-plugin)会生成SCustomer查询类型吗?
在查看querydsl-sql-示例时,我没有看到任何实体类,所以我猜查询类型是由QueryDSL从数据库模式生成的?是否有一种方法可以代替从实体生成SCustomer查询类型,就像我们使用querydsl一样?TIMESTAMPDIFF(SECOND, x, y)的数据库函数,但是它不是很容易移植.发布于 2015-07-21 13:49:41
使用模板表达式,您应该能够将任何定制的JPQL片段注入到Querydsl查询中。回答你的第一个问题。
在同一个项目中使用querydsl和querydsl是可能的,但也增加了一些复杂性。
https://stackoverflow.com/questions/31341299
复制相似问题