sql >> Databasteknik >  >> RDS >> PostgreSQL

R2DBC och enum (PostgreSQL)

Testad med org.springframework.data:spring-data-r2dbc:1.0.0.RELEASE och io.r2dbc:r2dbc-postgresql:0.8.1.RELEASE .

Kotlin-version.

  1. Definiera en enum-klass

    enum class Mood {
        UNKNOWN,
        HAPPY,
        SAD
    }
    
  2. Skapa en anpassad codec

    class MoodCodec(private val allocator: ByteBufAllocator) :  Codec<Mood> {
        override fun canEncodeNull(type: Class<*>): Boolean = false
    
        override fun canEncode(value: Any): Boolean = value is Mood
    
        override fun encode(value: Any): Parameter {
            return Parameter(Format.FORMAT_TEXT, oid) {
                ByteBufUtils.encode(allocator, (value as Mood).name)
            }
        }
    
        override fun canDecode(dataType: Int, format: Format, type: Class<*>): Boolean = dataType == oid
    
        override fun decode(buffer: ByteBuf?, dataType: Int, format: Format, type: Class<out Mood>): Mood? {
            buffer ?: return null
            return Mood.valueOf(ByteBufUtils.decode(buffer))
        }
    
        override fun type(): Class<*> = Mood::class.java
    
        override fun encodeNull(): Parameter =
            Parameter(Format.FORMAT_TEXT, oid, Parameter.NULL_VALUE)
    
        companion object {
            // Get form `select oid from pg_type where typname = 'mood'`
            private const val oid = YOUR_ENUM_OID
        }
    }
    
  3. Registrera codec

    Du kan behöva ändra runtimeOnly("io.r2dbc:r2dbc-postgresql") till implementation("io.r2dbc:r2dbc-postgresql")

    @Configuration
    @EnableR2dbcRepositories
    class AppConfig : AbstractR2dbcConfiguration() {
        override fun connectionFactory(): ConnectionFactory = PostgresqlConnectionConfiguration.builder()
            .port(5432) // Add your config here.
            .codecRegistrar { _, allocator, registry ->
                registry.addFirst(MoodCodec(allocator))
                Mono.empty()
            }.build()
            .let { PostgresqlConnectionFactory(it) }
    }
    



  1. ASP.NET/Identity Error:Entitetstypen ApplicationUser är inte en del av modellen för det aktuella sammanhanget

  2. Oracle SQL:Välja en enda rad med senaste datum mellan flera kolumner

  3. Att dela en kommaseparerad sträng i Oracle fungerar inte

  4. Hur kör man genererad SQL från en variabel?