Re[2]: Mybatis. Выбрать из БД byte[]
От: karbofos42 Россия  
Дата: 20.09.23 06:02
Оценка:
Здравствуйте, r0nd, Вы писали:

R>Проблема здесь связана с тем, что MyBatis не знает, как правильно маппить столбец типа bytea в Postgresql на тип byte[] в Java. Вам нужно использовать org.apache.ibatis.type.TypeHandler для корректного маппинга bytea в byte[].


Ну, он же маппит как-то в byte[][]. Я предполагаю, что он целевой массив воспринимает как: мне нужно из БД вернуть множество записей, а потом не может в единственный byte засунуть содержимое столбца bytea.
Поэтому когда прописываю массив массивов, там всё у него получается. Первый массив — это для строк, а вложенные — это уже под строки.
С объектами и примитивами такой проблемы не было, т.к. они не являются коллекцией и библиотека чётко может понять, что нужно единственную запись взять.

R>С этими настройками MyBatis должен корректно маппить столбцы типа bytea на массивы байтов byte[].


В MyBatis есть стандартный ByteArrayTypeHadler, который несколько иначе работает, но прописывается в репозитории хендлеров.
Если я у запроса не пропишу resultType, то берётся стандартный хендлер, который падает. Если прописываю тип "_byte[]" и попадаю в предложенный самодельный, то возникает две проблемы:
1) rs.getObject(columnName) возвращает не PGobject, а byte[] (забавно, что rs.getBytes(columnName) падает с исключением), следовательно в исходном виде падает на попытке преобразования в PGobject
2) если я из методов без промежуточного PGobject возвращаю byte[] из getObject, то в библиотеке внутри что-то дальше падает с ошибкой IllegalArgument

Похоже, что проще забить и оставить костылик в виде byte[][].
Ну, либо делать класс-обёртку, чтобы он библиотекой как коллекция не воспринимался и нормально для него TypeHandler подхватывался без конфликтов со стандартными.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.