Отображение ARRAY [] :: INTEGER [] в спящем режиме - PullRequest
0 голосов
/ 12 декабря 2018

в postgres мы можем использовать следующую конструкцию для создания временной таблицы массива типов целых чисел.Например, singleTestColumn ниже.Обычно это используется во время CTE.

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

Как правильно отобразить этот столбец в спящем SQL-запросе Hibernate.

с учетом описанного здесь пользовательского отображения массива целых чисел 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 голосов
/ 14 декабря 2018

Hibernate рассматривает вещи, начинающиеся с :, в качестве параметров, поэтому ваш запрос компилируется в:

SELECT  ARRAY[]:?[] AS singleTestColumn

Вам необходимо использовать escape-последовательность (я использовал это в Hibernate 4.3):

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

или стандартное приведение SQL:

String sql_query = "SELECT  CAST(ARRAY[] AS integer[]) AS singleTestColumn";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...