Как описать тип поля jsonb таблицы в джаве
Есть таблица с типом поля jsonb, какой можно тип применить к полю при описании этой модели на джаве?
Ответы (2 шт):
Может не совсем правильно понял вопрос, ну да ладно...
Ничего не могу сказать про спринг. Может у него есть своё удобное средство.
Но у голого 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, если что.
Вариант без самописного конвертера.
Подключаете в проект библиотеку hibernate-types-52
<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>2.9.10</version> </dependency>Над java-классом вашей сущности необходимо добавить следующие аннотации
@TypeDefs({ @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) }) public class YourEntityName { //fields, getters, setters, et.c. }Над полем, хранящим jsonb в базе данных добавить аннотации
@Type(type = "jsonb") @Column(columnDefinition = "jsonb") private String raw;
После этого вы можете объявлять как вам удобно тип поля - строкой, объектом вашего dao-слоя, коллекцией объектов (List), ассоциативным массивом (Map).