如何将 Postgres 中的 bigint 值写入 String kotlin 字段?

问题描述 投票:0回答:1

我正在使用 kotlin 和 spring 数据。我有一个带有“phone”列的表,它在数据库中是 BIGINT 类型,但在我的 @Table 类中,该字段具有 String 类型(

val phone: String
)。 因此,当我尝试使用 Spring 数据存储库从数据库获取一些记录时,我得到了
PostgresqlBadGrammarException: operator does not exist: bigint = character varying
。 如何在不改变类型的情况下修复它?我相信一定有一些注释转换器什么的。

我尝试在 Spring 数据存储库中创建自定义查询并将选择结果转换为 varchar - “

SELECT phone::varchar from table...
”,但它不起作用。

java postgresql kotlin spring-data-jpa type-conversion
1个回答
0
投票

要将 PostgreSQL BIGINT 列映射到 Spring Data 中的 Kotlin String 字段而不更改类型,您可以使用自定义属性转换器。属性转换器用于将数据库列类型转换为 Java/Kotlin 类型,反之亦然。

以下是如何为您的案例创建自定义属性转换器:

  1. 为您的自定义属性转换器创建一个 Kotlin 类。这个类应该实现
    javax.persistence.AttributeConverter
    接口。就您而言,您希望在
    Long
    (Kotlin 中的 BIGINT)和
    String
    之间进行转换。这是一个例子:
import javax.persistence.AttributeConverter
import javax.persistence.Converter

@Converter(autoApply = true)
class BigIntToStringConverter : AttributeConverter<Long, String> {

    override fun convertToDatabaseColumn(attribute: Long?): String? {
        return attribute?.toString()
    }

    override fun convertToEntityAttribute(dbData: String?): Long? {
        return dbData?.toLong()
    }
}
  1. BigIntToStringConverter
    @Converter
    注释
    autoApply = true
    类。这告诉 JPA 自动将此转换器应用于映射到实体中的
    Long
    类型的所有属性。
    
    

  2. 在实体类中,使用
  3. String

    注释

    phone
    字段以指定列名称(如果它与属性名称不同)。这是一个例子:
    
    

  4. @Column
通过此设置,当您从数据库检索数据时,Spring Data 应该能够自动处理 BIGINT 和 String 之间的转换。

确保将

import javax.persistence.Column import javax.persistence.Entity import javax.persistence.Id import javax.persistence.Table @Entity @Table(name = "your_table_name") data class YourEntity( @Id val id: Long, @Column(name = "phone") val phone: String )

替换为表的实际名称,并调整实体类以匹配您的特定数据库架构。

    

© www.soinside.com 2019 - 2024. All rights reserved.