[英]HQL No data type for node exception when calling enclosed functions
當我打電話
List<Object[]> list = session.createQuery("select n.book, nvl(sum(n.val),0) from N n).list();
Hibernate在解析查詢並拋出問題時遇到了一些麻煩:
java.lang.Exception: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
\-[METHOD_CALL] MethodNode: '('
+-[METHOD_NAME] IdentNode: 'nvl' {originalText=nvl}
\-[EXPR_LIST] SqlNode: 'exprList'
+-[AGGREGATE] AggregateNode: 'sum'
| \-[DOT] DotNode: 'n0_.val' {propertyName=val,dereferenceType=PRIMITIVE,getPropertyPath=val,path=n.val,tableAlias=n0_,className=com.myCompany.name.entity.account.N,classAlias=n}
| +-[ALIAS_REF] IdentNode: 'n0_.id' {alias=n, className=com.myCompany.name.entity.account.N, tableAlias=n0_}
| \-[IDENT] IdentNode: 'val' {originalText=val}
\-[NUM_INT] LiteralNode: '0'
然而
List<Object[]> list = session.createQuery("select n.book, sum(n.val) from N n).list();
工作正常。 我想知道我的第一查詢語法是否有問題或Hibernate是否不支持封閉函數?
編輯:NVL是Oracle函數,我們在生產中使用Oracle DB。 但是,我使用內存中的H2數據庫進行單元測試。 據說H2也支持NVL 。
看來您對SQL和HQL有點困惑。 HQL不是SQL。 SQL支持許多功能,但是它們是特定於實現的。 其中一些是“標准的”,即在不同的數據庫中具有類似的實現。
HQL提供了獨立於平台的方式來從關系數據庫中查詢對象,並且僅支持功能非常有限的列表( sum
, min
, max
, avg
, count
)。 有關詳細信息,請參見以下資源: https : //docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-aggregation
嘗試使用Google“ sql nvl函數”並查看結果。 Oracle支持此功能,但MySQL不支持(例如)。 這意味着很難使其休眠以支持它。 而且專門針對此功能,恕我直言,即使嘗試使用它也不是一個好方法。 將用其他值替換null
的責任移到您的實體或DAO層。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.