2017-03-17 52 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