在休眠状态下映射ARRAY [] :: INTEGER []

时间:2018-12-12 16:50:49

标签: hibernate hibernate-mapping

在postgres中,我们可以使用以下结构创建一个整数数组类型的临时表。例如下面的singleTestColumn。通常在CTE期间使用。

String sql_query = "SELECT  ARRAY[]::INTEGER[] AS singleTestColumn";

如何在休眠本机sql查询中正确映射此列。

考虑了https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/#comment-26149此处描述的自定义整数数组映射 也就是说,我的意思是IntArrayType类。

        Query<Object[]> query = session.createNativeQuery(sql_query)
                .addScalar("singleTestColumn", com.vladmihalcea.hibernate.type.array.IntArrayType.INSTANCE)
                ;


        List<Object[]> objectCollection = (List<Object[]>) query.getResultList();

问题是为什么以下内容不起作用并在hibernate 5.3.7.Final和org.hibernate.dialect.PostgreSQL95Dialect中给出错误。

o.h.e.j.s.SqlExceptionHelper             : SQL Error: 0, SQLState: 42601
o.h.e.j.s.SqlExceptionHelper             : ERROR: syntax error at or near ":"
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

1 个答案:

答案 0 :(得分:1)

Hibernate将以:开头的内容作为参数,因此您的查询被编译为:

SELECT  ARRAY[]:?[] AS singleTestColumn

您需要使用一个转义序列(我在Hibernate 4.3中使用了该序列):

String sql_query = "SELECT  ARRAY[]\\:\\:integer[] AS singleTestColumn";

或标准SQL强制转换:

String sql_query = "SELECT  CAST(ARRAY[] AS integer[]) AS singleTestColumn";