INSERT不包含spring-data-r2dbc的值

当我尝试使用spring r2dbc数据插入仅具有ID的实体时,出现以下异常:

Exception while fetching data (addChat) : INSERT contains no values

java.lang.IllegalStateException: INSERT contains no values
    at org.springframework.data.r2dbc.core.DefaultStatementMapper.getMappedObject(DefaultStatementMapper.java:159) ~[spring-data-r2dbc-1.0.0.RC1.jar:1.0.0.RC1]
    at org.springframework.data.r2dbc.core.DefaultStatementMapper.getMappedObject(DefaultStatementMapper.java:144) ~[spring-data-r2dbc-1.0.0.RC1.jar:1.0.0.RC1]

数据库postgres:

create table chats
(
    id serial not null
        constraint chats_pkey
            primary key
);

实体

import org.springframework.data.annotation.Id
import org.springframework.data.relational.core.mapping.Table

@Table("chats")
data class ChatEntity(
        @Id val id: Int? = null
)

存储库:

import org.springframework.data.r2dbc.repository.R2dbcRepository
import org.springframework.stereotype.Repository


@Repository
interface Chatsrepository : R2dbcRepository<ChatEntity,Int>

服务:

//Service
val chatAdded = chatsrepository.save(ChatEntity(id = null)).awaitFirst()

在同一项目中,我还有其他具有id的实体和其他工作正常的列。 知道为什么我会有这个错误吗?

monkey1210 回答:INSERT不包含spring-data-r2dbc的值

如果使用的是postgres,则可以像下面一样执行(…)并返回插入的值。

  val chatAdded = db.execute("INSERT INTO chats\n" +
                "        DEFAULT VALUES\n" +
                "        RETURNING *")
                .map { row -> ChatEntity(id = row.get("id") as Int) }
                .awaitOne()
,

我遇到了同样的问题,并通过我的实体实现了 org.springframework.data.domain.Persistable ,其中 T 是实体 ID 类型。

这是我在 kotlin 和协程中实现它的方式。 我假设您的上下文配置没问题,并且您正确配置了 org.springframework.r2dbc.core.DatabaseClient

实体:

import org.springframework.data.relational.core.mapping.Table
import org.springframework.data.annotation.*
import org.springframework.data.domain.Persistable
import javax.validation.constraints.NotNull
import javax.validation.constraints.Size

@Table("`authority`")
data class Authority(
        @Id val role: @NotNull @Size(max = 50) String
) : Persistable<String> {
    override fun isNew() = true
    override fun getId() = role
}

DAO:

import org.springframework.data.repository.kotlin.CoroutineCrudRepository

@Repository("authorityRepository")
interface AuthorityRepository : CoroutineCrudRepository<Authority,String>

功能测试

import kotlinx.coroutines.runBlocking
import kotlin.test.assertEquals
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import Authority
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.r2dbc.core.DatabaseClient
import org.springframework.r2dbc.core.awaitSingle

@SpringBootTest
class AuthorityRepositoryFuncTest {
    @Autowired
    lateinit var db: DatabaseClient
    @Autowired
    private lateinit var authorityRepository: AuthorityRepository

    suspend fun countAuthority(): Long = db
            .sql("SELECT COUNT(*) FROM `authority`")
            .fetch()
            .awaitSingle()
            .values
            .first() as Long

    @Test
    fun `test save authority`() = runBlocking {
        val countAuthorityBeforeSave = countAuthority()
        val authorityTestValue = "ROLE_TEST"
        authorityRepository.save(Authority(role = authorityTestValue))
        assertEquals(countAuthorityBeforeSave + 1,countAuthority())
    }
}
本文链接:https://www.f2er.com/2998549.html

大家都在问