unexpected token: #39;lt;function_namegt;#39; error when using hibernate, JPQL and postgres function(使用Hibernate、JPQL和Postgres函数时出现意外标记:#39;lt;Function_Namegt;#39;错误)
问题描述
我将PostgreSQL 9.6
与Hibernate 5.4.8
、Java 8
和Spring框架一起使用。我需要调用postgres函数
CREATE OR REPLACE FUNCTION function_that_return_array(givenIds character varying(255)) RETURNS int[] AS
'
BEGIN
RETURN string_to_array($1,'','');
END
' LANGUAGE plpgsql;
在JPQL查询中
private static final String JPQL_QUERY =
" SELECT NEW com.package.CustomProjection( " +
" e.id, " +
" e.value " +
" ) " +
" FROM SomeEntity e " +
" WHERE e.id = ANY(function_that_return_array(:ids))";
和使用实体管理器:
@Autowired
private final EntityManager entityManager;
// ...
this.entityManager.createQuery(JPQL_QUERY, CustomProjection.class)
.setParameter("ids", "1,2,3")
.getResultList();
并导致以下异常:
antlr.NoViableAltException: unexpected token: function_that_return_array
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1055) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.subQuery(HqlBaseParser.java:3910) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.quantifiedExpression(HqlBaseParser.java:3515) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3373) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
...
antlr.MismatchedTokenException: expecting EOF, found ')'
at antlr.Parser.match(Parser.java:211) ~[antlr-2.7.7.jar:?]
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:215) [hibernate-core-5.4.8.Final.jar:5.4.8.Final]
上面的例子非常简单,但它正确地表示了生产问题。当我在原生SQL中调用上面的函数时,它工作得很好:
select *
from some_entity e
where e.id = ANY(function_that_return_array('1,2,3,4'))
有谁知道如何在JPQL和Hibernate中调用postgres函数,或者能指出我做错了什么?我读了很多文章like this one,所以我试了几十个组合,但到目前为止都没有成功。提前谢谢。
推荐答案
在休眠方言中,您不能直接调用未注册的自定义数据库函数。 Clear,Hibernate中的例外是对您的函数一无所知:
unexpected token: function_that_return_array
您在此有两个选项:
- 通过自定义函数的泛型机制调用您的函数:
使用
function('function_that_return_array', '1,2,3,4')
而不是
function_that_return_array('1,2,3,4')
- 第二个选项是注册您的函数: https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/dialect/Dialect.html#registerFunction-java.lang.String-org.hibernate.dialect.function.SQLFunction-
示例:
public class MyDialect extends PostgreSQLXXDialect {
public MyDialect() {
super();
registerFunction("function_that_return_array", new StandardSQLFunction("function_that_return_array"));
}
}
这篇关于使用Hibernate、JPQL和Postgres函数时出现意外标记:';<;Function_Name>;';错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用Hibernate、JPQL和Postgres函数时出现意外标记:';<;Function_Name>;';错误
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01