Java 如何修复Hibernate中的命名查询错误(意外标记:天)?

Java 如何修复Hibernate中的命名查询错误(意外标记:天)?,java,hibernate,named-query,Java,Hibernate,Named Query,以下是查找超过90天的活动的命名查询: "DELETE FROM PAActivity pa WHERE pa.status IN (:statusSet) AND cast(pa.datoFinish as date) < cast(DATE_SUB(current_date(), INTERVAL (:noofdays) DAY) as date)" “从活动pa中删除,其中pa.status IN(:statusSet)和cast(pa.datoFinish as date)

以下是查找超过90天的活动的命名查询:

"DELETE FROM PAActivity pa WHERE pa.status IN (:statusSet) AND cast(pa.datoFinish as date) < cast(DATE_SUB(current_date(), INTERVAL (:noofdays) DAY) as date)"
“从活动pa中删除,其中pa.status IN(:statusSet)和cast(pa.datoFinish as date)
在编译期间,它会出现以下Hibernate异常:

ERROR 2018-04-24 11:00:07,579 o.h.h.i.a.ErrorCounter - line 1:243: unexpected token: DAY
ERROR 2018-04-24 11:00:07,579 o.h.h.i.a.ErrorCounter - line 1:243: unexpected token: DAY
line 1:243: unexpected token: DAY
    at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:876)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3472)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3250) .
.
.
.
.
WARN  2018-04-24 11:00:07,641 o.h.h.i.a.HqlParser - HHH000203: processEqualityExpression() : No expression to process!
ERROR 2018-04-24 11:00:08,094 o.h.i.SessionFactoryImpl - HHH000177: Error in named query: deletePAActivityByProcessIDs
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: DAY near line 1, column 243 [DELETE FROM fn.gover.model.PAActivity pa WHERE pa.status IN (:statusSet) AND cast(pa.datoFinish as date) < cast(DATE_SUB(current_date(), INTERVAL (:noofdays) DAY) as date)]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
错误2018-04-24 11:00:07579 o.h.h.i.a.错误计数器-第1行:243:意外令牌:天
错误2018-04-24 11:00:07579 o.h.h.i.a.ErrorCounter-行1:243:意外令牌:天
第1行:243:意外标记:天
位于org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:876)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3472)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3250)。
.
.
.
.
WARN 2018-04-24 11:00:07641 o.h.h.i.a.HqlParser-HHH000203:processEqualityExpression():没有要处理的表达式!
错误2018-04-24 11:00:08094 o.h.i.SessionFactoryImpl-HH000177:命名查询中的错误:DeletePaActivityByProcessId
org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:第1行第243列附近的日期[从fn.gover.model.PAActivity pa中删除,其中pa.status位于(:statusSet)和cast(pa.datoFinish as date)
我认为问题在于HQL不支持间隔

你可以用两种方法解决你的问题。 第一限制标准

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR, -90); 
Criteria criteria = session.createCriteria(Yourclass.class);
criteria.add(Restrictions.ge("datoFinish", c.getTime());
List results = criteria.list();
或者只需更改您的查询,如:

AND cast(pa.datoFinish as date) < cast(:dateMinus90 as date)
第二种方法是继承方言类并注册sql函数。比如甲骨文

public class MyOracleDialect extends Oracle10gDialect {
    @Override
    protected void registerFunctions() {
        super.registerFunctions();
        registerFunction("sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, " date_sub(?1, INTERVAL ?2 DAY)"));
    } }

然后在hibernate道具中,您应该使用这种方言。但我认为这不是最好的方法。

这可能会有帮助:
public class MyOracleDialect extends Oracle10gDialect {
    @Override
    protected void registerFunctions() {
        super.registerFunctions();
        registerFunction("sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, " date_sub(?1, INTERVAL ?2 DAY)"));
    } }