2017-03-17 73 views
2

我用下面给出的HQL查询:意想不到的AST节点

select A.id.customerName, 
     A.id.customerId, 
     A.id.IZone, 
     B.id.accountType, 
     B.id.accountNumber, 
     B.id.bankBranch, 
     (DAYS(current_date)-DAYS(B.id.enrolledDate)) - 
     (select count(distinct C.id.DWkhol) from Holiday C 
     where C.id.ICo='01' and 
       C.id.DWkhol between B.id.enrolledDate and current_date) 
from Profile A, Account B 
where B.id.accountNumber != ' ' and 
     A.id.customerId= B.id.customerId; 

相同的查询工作在SQL开发人员罚款,我能够看到的值。 但我收到expections当我通过我的java类调用这个查询:

[17年3月16日21:02:29:624 EDT] 00000027 SystemOutØ406868 [Web容器:1] ERROR组织。 hibernate.hql.PARSER - :0:0: 意外的AST节点:查询[3/16/17 21:02:29:626 EDT] 00000027 SystemOut O 406868 [WebContainer:1] DEBUG org.hibernate.hql。 ast.ErrorCounter - :0:0:意外的AST节点: 查询:0:0:意外的AST节点:在 处查询org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1312) at org。 hibernate.hql.antlr.HqlSqlBaseWalker.arithmetic EXPR(HqlSqlBaseWalker.java:2749) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2006) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1825) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1394) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:553) 在 org.hibernate.hql .antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229) 在 org.hiber nate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) 在 org.hibernate.hql.ast.QueryTranslatorImpl。编译(QueryTranslatorImpl.java:13 [3/16/17 21:02:29:626 EDT] 00000027 SystemOut O 406870 [WebContainer:1] ERROR org.hibernate.hql.PARSER - right-hand 二进制的操作数运算符为null [3/16/17 21:02:29:627 EDT] 00000027 SystemOut O 406870 [WebContainer:1]调试 org.hibernate.hql.ast.ErrorCounter - 二进制 运算符的右侧操作数是零二元运算符的空右操作数为空 在 org.hibernate.hql.ast.tree.BinaryArithmeticOperatorNode.initialize(BinaryArithmeticOperatorNode.java:48) 在 org.hibernate.hql.ast.HqlSqlWalker.prepareArithmeticOperator(HqlSqlWalker.java:1033) 在 org.hibernate.hql。 antlr.HqlSqlBaseWalker.arithmeticExpr(HqlSqlBaseWalker.java:2756) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2006) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker。的java:1825) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1394) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:553 ) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281) 在 org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229) 在 org.hibernate作为。 hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251) at org.hibernate.hql.ast.QueryTranslatorImpl。doCompile(QueryTranslatorImpl.java:183) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)

+0

'DAYS'看起来像一个Sybase函数,我怀疑HQL会支持它。请更新您的问题,并告诉我们您正在使用的数据库以及此查询应该执行的操作。 –

+0

Hello Tim Beigeleisn,数据库是DB2,查询从配置文件和帐户表中检索其帐户号不为空的客户详细信息,并计算他们持有帐户的时间。持续时间以天计。 – BrinzN

+0

我不认为你可以使用'DAYS'。更改您的查询。 –

回答

2

HQL不支持DAYS()函数,这是一个DB2特定功能。但是,从documentation开始,它应该支持EXTRACT(),假设底层数据库支持它,DB2就是这种情况。所以,你应该能够取代你查询的这个部分:

DAYS(current_date) - DAYS(B.id.enrolledDate) 

与此:

EXTRACT(EPOCH FROM current_date) - EXTRACT(EPOCH FROM B.id.enrolledDate)/60*60*24 

提取约会时代产生的秒数自1月1日,1970年我们则将其转换为天数除以60*60*24

+0

中完成我尝试了上述。它给我语法例外。我无法继续进行此操作。其实问题不在于当前日期 - 已注册日期计算。问题开始时,我补充说:(选择计数(独特C.id.DWKhol)假日C 其中C.id.ICo = '01'和 C.id.DWKhol between B.id.enrolledDate和current_date之间) – BrinzN