首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用querydsl/querydsl的平均日期差

使用querydsl/querydsl的平均日期差
EN

Stack Overflow用户
提问于 2015-07-10 12:53:32
回答 1查看 1.6K关注 0票数 6

我试图使用QueryDSL计算平均日期差异。

我创建一个小项目是为了演示我试图以一种简化的方式完成的任务(真正的查询要复杂得多,包含大量的联接/ where / sort子句)。我们有一个带有客户字段的birthDate类,我们正在试图获得客户的平均年龄(以秒为单位)。我们也想要最大的年龄,但让我们关注这个帖子的平均年龄。

我尝试使用querydsl-jpa编写这个查询。,但由于一个模糊的错误,它失败了:

代码语言:javascript
复制
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中获益。

以下是我的问题:

  1. 是否可以使用querydsl计算平均日期差异,让它使用JPA2.1支持调用本机数据库函数(可能使用Expressions.numberTemplate())?还是我们被迫使用querydsl?
  2. 如果我们必须使用querydsl,我们如何同时生成QCustomerSCustomerQCustomer目前是使用插件“com.mysema.maven:apt plugin”从客户实体生成的。如果我正确理解,我必须使用不同的插件 (com.querydsl:querydsl-maven-plugin)会生成SCustomer查询类型吗? 在查看querydsl-sql-示例时,我没有看到任何实体类,所以我猜查询类型是由QueryDSL从数据库模式生成的?是否有一种方法可以代替从实体生成SCustomer查询类型,就像我们使用querydsl一样?
  3. 如果我们使用querydsl,那么在querydsl查询中是否有一种“重用”我们的querydsl谓词/排序/联接子句的方法?还是必须使用querydsl-特定于sql的类复制代码?
  4. 我还考虑创建一个委托给TIMESTAMPDIFF(SECOND, x, y)的数据库函数,但是它不是很容易移植.
  5. 我是不是遗漏了什么?有更简单的方法来做我想做的事吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-21 13:49:41

使用模板表达式,您应该能够将任何定制的JPQL片段注入到Querydsl查询中。回答你的第一个问题。

在同一个项目中使用querydsl和querydsl是可能的,但也增加了一些复杂性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31341299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档