gpt4 book ai didi

jpql - 使用 querydsl-jpa/querydsl-sql 的平均日期差

转载 作者:行者123 更新时间:2023-12-04 15:56:20 34 4
gpt4 key购买 nike

我正在尝试使用 QueryDSL 计算平均日期差异。
我创建了 a small project以简化的方式演示我要完成的工作(真正的查询要复杂得多,有大量的连接/位置/排序子句)。我们有一个 Customer带有 birthDate 的类字段,我们正在尝试获取客户的平均年龄(以秒为单位)。我们还想要最大年龄,但让我们关注这篇文章的平均值。
I tried writing this query using 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() ,但它不会返回正确的值。如果我们想获得以秒为单位的日期差异,似乎我们需要找到某种方法来调用特定于数据库的日期/时间差异函数,而不仅仅是使用减号。
可悲的是, computing a date difference doesn't seem to be possible in JPQL ,所以我猜 querydsl-jpa 也有限制。所以我们必须编写一个原生 SQL 查询,或者找到一些技巧来让 QueryDsl 生成的 JPQL 调用一个原生数据库函数。
JPA 2.1 added support for invoking database functions ,但是有一个问题:MySQL函数采用 TIMESTAMPDIFF(SECOND, '2012-06-06 13:13:55', '2012-06-06 15:20:18')的形式.如果第一个参数 ( SECOND ) 是一个字符串,这可能是可能的,但它似乎是对某种常量的引用,并且在第一个参数不加引号的情况下生成 JPQL 似乎很复杂。
QueryDSL added support for date differences ,但似乎大部分代码都驻留在 querydsl-sql 项目中,所以我想知道我是否可以通过 querydsl-jpa 从中受益。
以下是我的问题:
  • 是否可以使用 querydsl-jpa 计算平均日期差异,让它可能使用 JPA 2.1 支持调用 native 数据库函数(可能使用 Expressions.numberTemplate() )?还是我们被迫使用querydsl-sql?
  • 如果我们必须使用querydsl-sql,我们如何生成QCustomerSCustomer ? QCustomer当前是使用插件“com.mysema.maven:apt-maven-plugin”从客户实体生成的。如果我理解正确,I have to use a different plugin (com.querydsl:querydsl-maven-plugin) 生成 SCustomer查询类型?
    当查看 querydsl-sql-example ,我没有看到任何实体类,所以我猜查询类型是由 QueryDSL 从数据库模式生成的?有没有办法从实体生成 SCustomer 查询类型,就像我们使用 querydsl-jpa 一样?
  • 如果我们使用 querydsl-sql,有没有办法在 querydsl-sql 查询中“重用”我们的 querydsl-jpa 谓词/排序/连接子句?或者我们是否必须使用特定于 querydsl-sql 的类来复制该代码?
  • 我也在考虑创建一个委托(delegate)给 TIMESTAMPDIFF(SECOND, x, y) 的数据库函数。 ,但它不是很便携...
  • 我错过了什么吗?有没有更简单的方法来做我想做的事情?
  • 最佳答案

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

    在同一个项目中同时使用 querydsl-jpa 和 querydsl-sql 是可能的,但会增加一些复杂性。

    关于jpql - 使用 querydsl-jpa/querydsl-sql 的平均日期差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341299/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com