Как описать тип поля jsonb таблицы в джаве

Есть таблица с типом поля jsonb, какой можно тип применить к полю при описании этой модели на джаве?


Ответы (2 шт):

Автор решения: Sergey

Может не совсем правильно понял вопрос, ну да ладно...

Ничего не могу сказать про спринг. Может у него есть своё удобное средство.
Но у голого jpa тоже кое-что имеется. Часто можно сделать конвертер для типа данных, который jpa самостоятельно не поддерживает.

Вот пример для postgres и json:

@Converter
public class PgJsonConverter implements AttributeConverter<MyClass, PGobject> {
    private final ObjectMapper mapper = new ObjectMapper();

    @Override
    public PGobject convertToDatabaseColumn(MyClass attribute) {
        if (attribute == null) return null;
        try {
            PGobject dbData = new PGobject();
            dbData.setValue(mapper.writeValueAsString(attribute));
            dbData.setType("json");
            return dbData;
        } catch (SQLException | JsonProcessingException ex) {
            throw new RuntimeException("Ошибка конвертора", ex);
        }
    }

    @Override
    public MyClass convertToEntityAttribute(PGobject dbData) {
        if (dbData == null) return null;
        try {
            return mapper.readValue(dbData.getValue(), MyClass.class);
        } catch (IOException ex) {
            throw new RuntimeException("Ошибка конвертора", ex);
        }
    }

}

Названия методов говорят сами за себя.

Поле в Entity

@Convert(converter = PgJsonConverter.class)
private MyClass field;

Таким нехитрым способом поле field класса MyClass будет храниться в базе в поле типа json. Тоже самое, думаю, можно сделать и для jsonb.

@Converter @Convert стандартные аннотации jpa.

Кроме того провайдеры jpa могут предоставлять свои способы решения данной задачи.

ObjectMapper - это jackson.

А вот запрос по этому полю придётся составлять на родном SQL, если что.

→ Ссылка
Автор решения: petrovich

Вариант без самописного конвертера.

  1. Подключаете в проект библиотеку hibernate-types-52

    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>2.9.10</version>
    </dependency>
    
  2. Над java-классом вашей сущности необходимо добавить следующие аннотации

    @TypeDefs({
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
    })
    public class YourEntityName {
        //fields, getters, setters, et.c.
    }
    
  3. Над полем, хранящим jsonb в базе данных добавить аннотации

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private String raw;
    

После этого вы можете объявлять как вам удобно тип поля - строкой, объектом вашего dao-слоя, коллекцией объектов (List), ассоциативным массивом (Map).

→ Ссылка