本文介紹了使用Hibernate、JPQL和Postgres函數時出現意外標記:';<;Function_Name>;';錯誤的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我將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>;';錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,