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 Number,Date并且不能扩展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天)。
你会怎么做?
看起来您正在寻找一种使用 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)
| 归档时间: |
|
| 查看次数: |
10569 次 |
| 最近记录: |