【问题标题】:INSERT contains no values with spring-data-r2dbcINSERT 不包含 spring-data-r2dbc 的值
【发布时间】:2023-03-12 16:53:02
【问题描述】:

当我尝试使用 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 和其他列的实体可以正常工作。 知道为什么我会出现此错误吗?

【问题讨论】:

    标签: java spring postgresql r2dbc spring-data-r2dbc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并且我的实体实现了 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
      }
      
      

      道:

      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())
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-11-29
        • 1970-01-01
        • 2020-07-04
        • 2020-09-22
        • 1970-01-01
        • 2022-11-07
        • 2020-07-13
        • 1970-01-01
        • 2021-05-16
        相关资源
        最近更新 更多