From acf4feb0854b080622a5f186287562dc642f52c4 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 7 Oct 2025 17:53:17 +0300 Subject: [PATCH 1/2] 1.2.4 --- gradle.properties | 2 +- .../example/jdbc/JdbcJsonbMapperModule.java | 40 +++++++++++++ .../example/jdbc/JdbcJsonbRepository.java | 58 ++----------------- 3 files changed, 46 insertions(+), 54 deletions(-) create mode 100644 kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbMapperModule.java diff --git a/gradle.properties b/gradle.properties index 21ba8bc0..00569639 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupId=ru.tinkoff.kora -koraVersion=1.2.3 +koraVersion=1.2.0-SNAPSHOT ##### GRADLE ##### diff --git a/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbMapperModule.java b/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbMapperModule.java new file mode 100644 index 00000000..1da042a4 --- /dev/null +++ b/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbMapperModule.java @@ -0,0 +1,40 @@ +package ru.tinkoff.kora.example.jdbc; + +import java.sql.Types; +import org.postgresql.util.PGobject; +import ru.tinkoff.kora.common.Module; +import ru.tinkoff.kora.database.jdbc.mapper.parameter.JdbcParameterColumnMapper; +import ru.tinkoff.kora.database.jdbc.mapper.result.JdbcResultColumnMapper; +import ru.tinkoff.kora.json.common.JsonReader; +import ru.tinkoff.kora.json.common.JsonWriter; +import ru.tinkoff.kora.json.common.annotation.Json; + +@Module +public interface JdbcJsonbMapperModule { + + @Json + default JdbcParameterColumnMapper jdbcJsonParameterColumnMapper(JsonWriter writer) { + return (stmt, index, value) -> { + if (value != null) { + PGobject jsonb = new PGobject(); + jsonb.setType("jsonb"); + jsonb.setValue(writer.toStringUnchecked(value)); + stmt.setObject(index, jsonb); + } else { + stmt.setNull(index, Types.NULL); + } + }; + } + + @Json + default JdbcResultColumnMapper jdbcJsonResultColumnMapper(JsonReader reader) { + return (row, index) -> { + var value = row.getString(index); + if (value == null) { + return null; + } else { + return reader.readUnchecked(value); + } + }; + } +} diff --git a/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbRepository.java b/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbRepository.java index 97598ef9..6b6aa89b 100644 --- a/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbRepository.java +++ b/kora-java-database-jdbc/src/main/java/ru/tinkoff/kora/example/jdbc/JdbcJsonbRepository.java @@ -1,71 +1,23 @@ package ru.tinkoff.kora.example.jdbc; import jakarta.annotation.Nullable; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.UUID; -import org.postgresql.util.PGobject; -import ru.tinkoff.kora.common.Mapping; import ru.tinkoff.kora.database.common.annotation.Column; import ru.tinkoff.kora.database.common.annotation.Query; import ru.tinkoff.kora.database.common.annotation.Repository; import ru.tinkoff.kora.database.jdbc.EntityJdbc; import ru.tinkoff.kora.database.jdbc.JdbcRepository; -import ru.tinkoff.kora.database.jdbc.mapper.parameter.JdbcParameterColumnMapper; -import ru.tinkoff.kora.database.jdbc.mapper.result.JdbcResultColumnMapper; -import ru.tinkoff.kora.json.common.JsonReader; -import ru.tinkoff.kora.json.common.JsonWriter; import ru.tinkoff.kora.json.common.annotation.Json; +/** + * @see JdbcJsonbMapperModule + */ @Repository public interface JdbcJsonbRepository extends JdbcRepository { - final class JsonbResultMapper implements JdbcResultColumnMapper { - - private final JsonReader reader; - - public JsonbResultMapper(JsonReader reader) { - this.reader = reader; - } - - @Override - public Entity.JsonbValue apply(ResultSet rs, int index) throws SQLException { - try { - var value = rs.getString(index); - return reader.read(value); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - } - - final class JsonbParameterMapper implements JdbcParameterColumnMapper { - - private final JsonWriter writer; - - public JsonbParameterMapper(JsonWriter writer) { - this.writer = writer; - } - - @Override - public void set(PreparedStatement stmt, int index, @Nullable Entity.JsonbValue value) throws SQLException { - if (value != null) { - PGobject jsonb = new PGobject(); - jsonb.setType("jsonb"); - jsonb.setValue(writer.toStringUnchecked(value)); - stmt.setObject(index, jsonb); - } - } - } - @EntityJdbc record Entity(UUID id, - @Mapping(JsonbResultMapper.class) - @Mapping(JsonbParameterMapper.class) - @Column("value") JsonbValue value) { + @Column("value") @Json JsonbValue value) { @Json public record JsonbValue(String name, String surname) {} @@ -77,7 +29,7 @@ public record JsonbValue(String name, String surname) {} @Query(""" INSERT INTO entities_jsonb(id, value) - VALUES (:entity.id, :entity.value) + VALUES (:entity.id, :entity.value::jsonb) """) void insert(Entity entity); } From d47e64840f05850b9f9fc1a2306d69e783659959 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 7 Oct 2025 18:32:06 +0300 Subject: [PATCH 2/2] 1.2.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 00569639..70ea569f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupId=ru.tinkoff.kora -koraVersion=1.2.0-SNAPSHOT +koraVersion=1.2.4 ##### GRADLE #####