我正在使用 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...
”,但它不起作用。
要将 PostgreSQL BIGINT 列映射到 Spring Data 中的 Kotlin String 字段而不更改类型,您可以使用自定义属性转换器。属性转换器用于将数据库列类型转换为 Java/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()
}
}
用
BigIntToStringConverter
和 @Converter
注释 autoApply = true
类。这告诉 JPA 自动将此转换器应用于映射到实体中的 Long
类型的所有属性。
String
注释
phone
字段以指定列名称(如果它与属性名称不同)。这是一个例子:
@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
)
替换为表的实际名称,并调整实体类以匹配您的特定数据库架构。