当前位置: 首页 > 知识库问答 >
问题:

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

钱和平
2023-03-14

我正在尝试使用QueryDSL计算平均日期差异。

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-jpa在这方面也有限制。因此,我们必须编写一个本机SQL查询,或者找到一些黑客来让QueryDSL生成的JPQL调用一个本机数据库函数。

JPA 2.1增加了对调用数据库函数的支持,但有一个问题:MySQL函数的形式为timestampdiff(SECOND,'2012-06-06 13:13:55','2012-06-06 15:20:18')。如果第一个参数(second)是一个字符串,那么这可能是可能的,但它似乎是对某种常数的引用,并且在第一个参数未加引号的情况下生成JPQL似乎很复杂。

QueryDSL增加了对日期差异的支持,但似乎大部分代码都驻留在querydsl-sql项目中,所以我想知道是否可以利用QueryDSL-JPA从中受益。

以下是我的问题:

>

  • 是否可以使用querydsl-jpa计算平均日期差异,使其可以使用JPA 2.1支持调用本机数据库函数(可以使用expressions.numbertemplate())?还是我们被迫使用QueryDSL-SQL?

    在查看querydsl-sql-example时,我没有看到任何实体类,所以我猜测查询类型是由QueryDSL从数据库模式生成的?是否有一种方法可以从实体生成SCustomer查询类型,就像我们使用QueryDSL-JPA那样?

    如果我们使用querydsl-sql,有没有办法在querydsl-sql查询中“重用”我们的querydsl-jpa谓词/排序/联接子句?还是必须使用特定于QueryDSL-SQL的类来复制代码?

    我还在考虑创建一个委托timestampdiff(SECOND,x,y)的数据库函数,但它不是很可移植的...

  • 共有1个答案

    严兴旺
    2023-03-14

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

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

     类似资料:
    • 我有一个实体,它有一个表示上次活动的日期对象。我想查询一下平均空闲时间。因此在SQL中,类似于: 我试着这样算了一下差别: 我如何以日期/时间差(以秒为单位)来表示这个平均值?

    • 我正在尝试使用QueryDSL计算用户年龄和日期差。 但失败时出现此错误 谢谢

    • 我有一张这样的桌子: 如何在QueryDSL中编写一个表达式来查找仍然有效的条目(creationDate validity_Days)?

    • 我想用QueryDSL表达以下(Oracle)查询: 即。我想做日期算术。不幸的是,(由返回)不包含任何用于加减法的方法,仅用于比较(如或)。 我找到了,但也没有任何帮助。 是我遗漏了什么,还是QueryDSL不支持日期算术?

    • 原因:java.lang.annotation.annotationFormaterror:无效默认值:public abstract java.lang.class org.springframework.data.jpa.repository.config.enableJParepositories.repositoryBaseClass()

    • 问题内容: 有没有一种方法可以在oracle中平均多个日期?平均没有任何好处。 谢谢。 问题答案: “平均日期”的定义是主观的,但是您可以将日期转换为儒略数字,然后将其平均,四舍五入,然后转换回日期。