原因: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的主要内容,如果未能解决你的问题,请参考以下文章
“'NSInternalInconsistencyException' 的替代原因,原因:'此 NSPersistentStoreCoordinator 没有持久存储。'”