Java HQL差异2日期(以天为单位)
我编写了正确的SQL查询:Java HQL差异2日期(以天为单位),java,hibernate,postgresql,hql,Java,Hibernate,Postgresql,Hql,我编写了正确的SQL查询: SELECT i, (i.sme_end - '2015-09-10') FROM Incidents i WHERE (i.sme_end - '2015-09-10') <= 100 ORDER BY ('2015-09-10' - i.sme_end) 选择i,(i.sme\u结束-“2015-09-10”) 从事件一 其中(i.SMEND-'2015-09-10')在WHERE子句中将托盘(i.SMEND-:currentDate)转换为整数 (
SELECT i, (i.sme_end - '2015-09-10')
FROM Incidents i
WHERE (i.sme_end - '2015-09-10') <= 100
ORDER BY ('2015-09-10' - i.sme_end)
选择i,(i.sme\u结束-“2015-09-10”)
从事件一
其中(i.SMEND-'2015-09-10')在WHERE子句中将托盘(i.SMEND-:currentDate)转换为整数
(i.smeEnd-:currentDate)::整数要在where子句中将(i.smeEnd-:currentDate)转换为整数的托盘
(i.smeEnd-:currentDate)::integer不幸的是,Hibernate不能很好地处理日期/时间操作符(它通常不理解,它们可以返回什么类型)。在您的例子中,这意味着它将(i.smeEnd-:currentDate)
表达式视为时间戳
要克服此限制,您可以通过以下方式调整HQL:
- 在
WHERE
中,只需做一些数学运算
(i.smeEnd-:currentDate)不幸的是,Hibernate不能很好地处理日期/时间操作符(它通常不了解它们可以返回什么类型)。在您的例子中,这意味着它将(i.smeEnd-:currentDate)
表达式视为时间戳
要克服此限制,您可以通过以下方式调整HQL:
- 在
WHERE
中,只需做一些数学运算
(i.smeEnd-:currentDate)currentDate的类型是什么?days
和currentDate
的声明是什么?对不起,忘了写:java.util.Date currentDate=new java.util.Date(System.currentTimeMillis());整数天=100;currentDate
的类型是什么?days
和currentDate
的声明是什么?对不起,忘记写:java.util.Date currentDate=new java.util.Date(System.currentTimeMillis());整数天=100;“选择i,从IncidentEntity i中强制转换((i.SMEND-:currentDate)为整数),其中强制转换((i.SMEND-:currentDate)为整数)“选择i,从IncidentEntity i中强制转换((i.SMEND-:currentDate)为整数),强制转换((i.SMEND-:currentDate)为整数)和提取之间有什么不同(EPOCH FROM date_trunc('day',age(i.smeEnd,:currentDate))/60/60/24?有两个变量在工作。@maks28rus如果可以使用CAST
,就使用它(它是最简单的变量)。在我的设置中,我无法使CAST适用于此(可能我们使用不同的休眠版本)。CAST((i.smeEnd-:currentDate)作为整数)和EXTRACT之间有什么不同(EPOCH FROM date_trunc('day',age(i.smeEnd,:currentDate))/60/60/24?两个变体正在工作。@maks28rus如果您可以使用CAST
,请使用它(它是最简单的变体)。在我的设置中,我无法使强制转换为此工作(可能我们使用不同的Hibernate版本)。
java.util.Date currentDate = new java.util.Date(System.currentTimeMillis());
int days = 100;
session.createQuery("SELECT i, (i.smeEnd - :currentDate) "+
"FROM IncidentsEntity i " +
"WHERE (i.smeEnd - :currentDate) <= :days " +
"ORDER BY (i.smeEnd - :currentDate)")
.setParameter("days", days)
.setParameter("currentDate", currentDate);
SELECT i, EXTRACT(EPOCH FROM date_trunc('day', age(i.smeEnd, :currentDate))) / 60 / 60 / 24
FROM IncidentsEntity i
WHERE i.smeEnd <= (DATE(:currentDate) + :days)
ORDER BY i.smeEnd