Я не уверен, что сделаю это снова, но в прошлом, когда мне приходилось ограничивать мое приложение наиболее часто используемым подмножеством типов sql, я реализовывал двоичные объекты, используя отдельную таблицу char, и сохранял их в gzipped и база 64 закодирована. Используя сопоставление XML, это было что-то вроде:
<list name="encodedValue" lazy="true" table="TABLE" cascade="all-delete-orphan">
<key column="TABLE_ID"/>
<index column="SEQ"/>
<element type="string" column="LINE" length="2000"/>
</list>
В коде метод getValue извлекает результаты getEncodedValue, объединяет их все вместе, а затем декодирует и разархивирует. В качестве оптимизации я поместил столбец простых значений в родительскую таблицу и использовал его, если он мог уместиться в 2000 символов, и переходил к дочерней таблице только при необходимости.
Метод setValue сжал и закодировал его и сохранил в простом столбце, если он подходит, в противном случае разделите его на дочерние записи. Это также приводит к ленивой загрузке, и если данные помещаются в один столбец, даже не нужно выполнять отдельный запрос.
Вероятно, излишне, если вы знаете, что ваши базы данных будут поддерживать клобы, но в нашей ситуации сработало довольно хорошо.