计算JPA中两个日期之间的天数

Arn*_*lle 5 java postgresql jpa

我需要计算JPA中两个日期之间的天数。

例如 :

CriteriaBuilder.construct(
  MyCustomBean.class
  myBean.get(MyBean_.beginDate), //Expression<Date>
  myBean.get(MyBean_.endDate), //Expression<Date>
  myDiffExpr(myBean) //How to write this expression from the 2 Expression<Date>?
);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试了:

1)CriteriaBuilder.diff()。但它不能编译,因为此方法需要一些N extends NumberDate并且不能扩展Number

2)我试图扩展PostgreSQL82Dialect(因为我的目标数据库是PostgreSQL):

public class MyDialect extends PostgreSQL82Dialect {

  public MyDialect() {
    super();
    registerFunction("datediff", 
    //In PostgreSQL, date2 - date1 returns the number of days between them.
    new SQLFunctionTemplate(StandardBasicTypes.LONG, " (?2 - ?1) "));
  }
}
Run Code Online (Sandbox Code Playgroud)

这将编译并且请求成功,但是返回的结果不一致(今天和明天之间为78天)。

你会怎么做?

zbi*_*big 2

看起来您正在寻找一种使用 JPQL 的解决方案来执行诸如SELECT p FROM Period p WHERE datediff(p.to, p.from) > 10.

恐怕 JPQL 中没有这样的功能,所以我建议使用原生 SQL。如果用 Hibernate 扩展 Dialect,你的想法SQLFunctionTemplate非常聪明。我宁愿将其更改为使用,DATE_PART('day', end - start)因为这是使用 PostgreSQL 实现日期之间的天数差异的方法。

您还可以在 PostgreSQL 中function()定义函数并将其与 criteria 一起使用。

'CREATE OR REPLACE FUNCTION "datediff"(TIMESTAMP,TIMESTAMP) RETURNS integer AS \'DATE_PART('day', $1 - $2);\' LANGUAGE sql;'

cb.function("datediff", Integer.class, end, start);
Run Code Online (Sandbox Code Playgroud)

  • JPA 甚至无法减去日期这一事实充分说明了它在现实世界中的有用性。 (2认同)