簡體   English   中英

HQL調用封閉函數時,沒有節點異常的數據類型

[英]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提供了獨立於平台的方式來從關系數據庫中查詢對象,並且僅支持功能非常有限的列表( summinmaxavgcount )。 有關詳細信息,請參見以下資源: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM