0

I am trying to bind my data class for a sql query but I am getting a error when I am not using all the parameters from my data class. Is there a way to check in the sql query which parameters needs binding and which ones do not or allow to bind parameters which are not used. The error looks as following:

Request error
 java.lang.IllegalArgumentException: Identifier 'deleted_at' is not a valid identifier. Should be of the pattern '\$([\d]+)'.
    at io.r2dbc.postgresql.ExtendedQueryPostgresqlStatement.getIndex(ExtendedQueryPostgresqlStatement.java:196)
Caused by: java.lang.IllegalArgumentException: Identifier 'deleted_at' is not a valid identifier. Should be of the pattern '\$([\d]+)'.
    at io.r2dbc.postgresql.ExtendedQueryPostgresqlStatement.getIndex(ExtendedQueryPostgresqlStatement.java:196)

And this is the code I use: Repository:

      client
            .sql(
                """
                INSERT INTO app_user_settings (uuid, allows_to_process_transactions, app_user_id) VALUES (:uuid, :allows_to_process_transactions, :app_user_id)
                RETURNING *
                """.trimIndent()
            )
            .bind(AppUserSettingsWriteConverter(), appUserSettings)
            .map(AppUserSettingsReadConverter()::convert)
            .awaitOne()

Custom bind method:

fun <T> DatabaseClient.GenericExecuteSpec.bind(
    convertor: Converter<T, OutboundRow>,
    value: T
): DatabaseClient.GenericExecuteSpec {
    val outboundRow = convertor.convert(value!!)!!
    val t = outboundRow.toMap()
    var execution = this
    t.forEach { (t, u) ->
        execution = execution.bind(t.toString(), u)
    }
    return execution
}

WriteConverter:

class AppUserSettingsWriteConverter : Converter<AppUserSettings, OutboundRow> {
    override fun convert(source: AppUserSettings): OutboundRow {
        val outboundRow = OutboundRow()

        if (source.isSaved()) {
            outboundRow[SqlIdentifier.unquoted("id")] = Parameter.from(source.id)
        }
        outboundRow[SqlIdentifier.unquoted("uuid")] = Parameter.from(source.uuid)
        outboundRow[SqlIdentifier.unquoted("allows_to_process_transactions")] = Parameter.from(source.allowsToProcessTransactions)
        outboundRow[SqlIdentifier.unquoted("app_user_id")] = Parameter.from(source.appUserId)
        outboundRow[SqlIdentifier.unquoted("deleted_at")] = Parameter.fromOrEmpty(source.deletedAt, ZonedDateTime::class.java)

        return outboundRow
    }
}

I am using now a check if deleted_at is empty and then not bind it but would prefer if there is another way to do it.

MrAndre
  • 811
  • 1
  • 10
  • 26

0 Answers0