原因:org.hibernate.QueryException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.MethodNode

Posted

技术标签:

【中文标题】原因:org.hibernate.QueryException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.MethodNode【英文标题】:Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 【发布时间】:2021-09-23 14:23:18 【问题描述】:

我在 postgres 中有一个自定义创建的函数,现在我正在尝试从我的代码中调用自定义方法。这是存储库功能


    @Query(value = "select function('createCluster',:tName,:time,:iPattern)")
    boolean createClusterIndex(@Param("tName") String tableName, @Param("iPattern") String indexPattern, @Param("time") LocalDateTime time);

从此链接开始 https://thorben-janssen.com/database-functions/

我什至在 postgres 方言中通过函数注册

this.registerFunction("createcluster",new StandardSQLFunction("createCluster",new BooleanType()));

但是一旦我运行代码

Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 \-[METHOD_CALL] MethodNode: 'function (createCluster)'
    +-[METHOD_NAME] IdentNode: 'createCluster' originalText=createCluster
    \-[EXPR_LIST] SqlNode: 'exprList'
       +-[NAMED_PARAM] ParameterNode: '?' name=tName, expectedType=null
       +-[NAMED_PARAM] ParameterNode: '?' name=time, expectedType=null
       \-[NAMED_PARAM] ParameterNode: '?' name=iPattern, expectedType=null

    at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:161) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:1018) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:786) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:677) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    ... 106 common frames omitted
    

这可能是什么原因?我该如何解决这个问题?

我遇到的问题:

Using Spring JPA to setup a Aggregate Function for STRING_AGG with Postgresql for a Group_By

No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode HQL

Write & Call user-defined function in JPQL?

User defined PostgreSQL function in hibernate dialect throws exception

【问题讨论】:

【参考方案1】:

只需使用本机查询。 @Query(value = "select createCluster(:tName,:time,:iPattern)", nativeQuery = true

【讨论】:

我想避免使用原生查询 避免本机查询不会给您带来任何好处,因为我想这是一个特定于数据库的功能?无论如何,您可以通过在查询中添加 FROM 子句来避免这种情况。 Hibernate 需要一个 FROM 子句。 自定义函数是几乎每个 RDBMS Db 的一部分,但我不确定 No-Sql ,我添加的链接也都表明它应该是可能的。最后我确实尝试了 FROM 部分,但它也没有工作

以上是关于原因:org.hibernate.QueryException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.MethodNode的主要内容,如果未能解决你的问题,请参考以下文章

rca根本原因分析法是啥意思

ip、端口 连接失败问题常见原因

在MYSQL里 段错误 是啥原因

“'NSInternalInconsistencyException' 的替代原因,原因:'此 NSPersistentStoreCoordinator 没有持久存储。'”

Oracle连接太慢的原因及TNS无监听程序

ios 开发证书被撤销是啥原因