Spring Data JPAを使用したPostgreSQLの処理


PostgreSQLの特殊なデータ型


通常使用されるMySQLとは異なり、PostgreSQLでは複数のデータ型がサポートされています.たとえば、配列タイプ、JSONタイプ、JSONバイナリタイプなどをサポートします.
ただし、JPAのインプリメンテーションチェーンHibernateでは、このデータ型のデフォルトのカラムタイプはサポートされていないため、使用するにはカラムタイプを定義し、使用するカラムタイプにマッピングする必要があります.

Hypernetユーザー定義のデータ型のマッピング


カラムタイプを定義するには、UserTypeインタフェースを実装します.しかし、これは非常に面倒なことなので、ライブラリを使用します.UserTypeを直接実装する場合は、ここです。を参照してください.

依存性

implementation("com.vladmihalcea:hibernate-types-52:2.16.0")

インプリメンテーション

import com.vladmihalcea.hibernate.type.array.ListArrayType
import org.hibernate.annotations.TypeDef
import javax.persistence.*
import org.hibernate.annotations.Type

@Entity
@TypeDef(name="list-int", typeClass = ListArrayType::class)
class Summoner(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id: Long? = null,

    @Column(nullable = false)
    val puuid: String,

    @Column(nullable = false)
    var name: String,

    @Column(nullable = true)
    var recentMatchId: String,

    @Type(type = "list-int")
    @Column(columnDefinition = "integer[]")
    var analysisResults: List<Int>
)
まず、@TypeDef言語記述を使用してカラムタイプを定義し、サポートされていないカラムタイプを定義する場合、@Type言語記述を使用して上記で定義したカラムタイプを指定し、@Column言語記述がデータベースに入るカラムタイプを定義し、HyperNateがサポートしていないカラムクラスタイプList<Int>およびPostgreを定義します.SQLのinteger[]がマッピングされています.

テスト

@SpringBootTest
class SummonerRepositoryTest(
    @Autowired private val summonerRepository: SummonerRepository
) {

    @AfterEach
    fun tearDown(){
        summonerRepository.deleteAll()
    }

    @Test
    @DisplayName("Create 테스트")
    fun createTest() {
        // given
        val puuid = "puuid"
        val name = "쳇바퀴 속 다람쥐"
        val recentMatchId = "match_id"
        val analysisResult = listOf(1,4,5,6)
        val summoner = Summoner(
            puuid = puuid, name = name, recentMatchId = recentMatchId, analysisResults = analysisResult
        )

        // when
        val result = summonerRepository.save(summoner)

        // then
        println(result.id)
        assertThat(result.puuid).isEqualTo(puuid)
        assertThat(result.name).isEqualTo(name)
        assertThat(result.recentMatchId).isEqualTo(recentMatchId)
        assertThat(result.analysisResults).isEqualTo(analysisResult)
    }
}
テストを実行すると、新しいエンティティの挿入が正常であることを確認できます.

リファレンス


https://vladmihalcea.com/postgresql-array-java-list/
https://www.baeldung.com/hibernate-custom-types