Как преобразовать тип java в домен postgres с помощью спящего режима (springData)? - PullRequest
0 голосов
/ 13 июля 2020

Я создал домен в postgres:

create domain arrayofids as numeric[];

Теперь я хочу использовать домен в весенних данных следующим образом:

String fakeQuery = "unnest(CAST (:ids AS arrayofids))";
Query nativeQuery = entityManager.createNativeQuery(fakeQuery);
BigInteger[] arrayOfids = new BigInteger[] {new BigInteger("1"),new BigInteger("2)} //or It can be List. It is not important
nativeQuery.setParameter("ids", arrayOfids);
List resultList = nativeQuery.getResultList();

Конечно, я получаю ошибку:

org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to arrayofIds

Раньше я использовал https://dalesbred.org/docs/api/org/dalesbred/datatype/SqlArray.html, и он работал нормально или сам настраивал типы в JDB C. Hibernate не позволяет легко использовать мой домен.

Такой запрос:

select * from mtTbale where id in :ids

не интересует. Я должен использовать домен с unnest и CAST

1 Ответ

0 голосов
/ 13 июля 2020

Сделайте: ids как текстовое представление массива чисел, например "{1, 2}", и добавьте SELECT в запрос. Попробуйте следующее:

String fakeQuery = "SELECT unnest(CAST (:ids AS arrayofids))";
Query nativeQuery = entityManager.createNativeQuery(fakeQuery);
String arrayOfids = "{" + 1 + ", " + 2 + "}"; // obtain the string as is relevant in your case
nativeQuery.setParameter("ids", arrayOfids);
List resultList = nativeQuery.getResultList();

, и второй запрос должен выглядеть так:

select * from mtTbale where id = ANY(CAST(:ids AS arrayofids));

Вы также можете использовать сокращенный (и более читаемый) синтаксис приведения Postgres. Вместо CAST(:ids AS arrayofids) используйте :ids::arrayofids.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...