首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INSERT不包含带有spring-data-r2dbc的值

INSERT不包含带有spring-data-r2dbc的值
EN

Stack Overflow用户
提问于 2019-12-01 22:38:28
回答 2查看 973关注 0票数 0

当我尝试使用spring r2dbc数据插入一个只有一个id的实体时,我得到了以下异常:

代码语言:javascript
复制
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:

代码语言:javascript
复制
create table chats
(
    id serial not null
        constraint chats_pkey
            primary key
);

实体

代码语言:javascript
复制
import org.springframework.data.annotation.Id
import org.springframework.data.relational.core.mapping.Table

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

存储库:

代码语言:javascript
复制
import org.springframework.data.r2dbc.repository.R2dbcRepository
import org.springframework.stereotype.Repository


@Repository
interface ChatsRepository : R2dbcRepository<ChatEntity, Int>

服务:

代码语言:javascript
复制
//Service
val chatAdded = chatsRepository.save(ChatEntity(id = null)).awaitFirst()

在同一项目上,我有其他实体的id和其他列的工作很好。你知道我为什么会有这个错误吗?

EN

回答 2

Stack Overflow用户

发布于 2019-12-14 16:57:17

如果你使用postgres,你可以执行(…)如下所示,并返回插入的值。

代码语言:javascript
复制
  val chatAdded = db.execute("INSERT INTO chats\n" +
                "        DEFAULT VALUES\n" +
                "        RETURNING *")
                .map { row -> ChatEntity(id = row.get("id") as Int) }
                .awaitOne()
票数 0
EN

Stack Overflow用户

发布于 2021-04-29 08:09:37

我也遇到了同样的问题,并在我的实体实现org.springframework.data.domain.Persistable时持久化了它,其中T是实体id类型。

下面是我如何在kotlin和协程中实现它。我假设您的上下文配置是ok的,并且您正确地配置了org.springframework.r2dbc.core.DatabaseClient

实体:

代码语言:javascript
复制
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:

代码语言:javascript
复制
import org.springframework.data.repository.kotlin.CoroutineCrudRepository

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

功能测试

代码语言:javascript
复制
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())
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59126551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档