升级Spring Boot 3/Hibernate 6后List类型AttributeConverter报错求助
解决Spring Boot 3/Hibernate 6中List AttributeConverter启动异常问题
问题原因
Hibernate 6对集合类型的类型推断逻辑发生变化:当属性为List<String>这类集合接口时,Hibernate默认会将其识别为需要集合映射(如@ElementCollection)的类型,而非通过AttributeConverter转换为基础字符串类型,因此抛出Named type [interface java.util.List] did not implement BasicType nor UserType异常。
解决方案(无需自定义类型,保留AttributeConverter)
方案1:将List接口改为具体实现类
把实体类中的List<String>替换为具体的集合实现类(如ArrayList<String>),同时调整转换器的泛型类型:
修改后的实体类属性:
@Column(name = "iface_ids", columnDefinition = "TEXT") @Convert(converter = StringListToStringConverter::class) var interfaceIds: ArrayList<String> = arrayListOf()
修改后的转换器:
@Converter class StringListToStringConverter : AttributeConverter<ArrayList<String>, String> { override fun convertToDatabaseColumn(attribute: ArrayList<String>?): String? { return attribute?.joinToString(",") } override fun convertToEntityAttribute(dbData: String?): ArrayList<String>? { return dbData?.split(",")?.filter { it.isNotEmpty() }?.let { ArrayList(it) } ?: arrayListOf() } }
方案2:添加@JdbcTypeCode指定JDBC类型
如果不想修改属性的接口类型,可通过@JdbcTypeCode明确指定字段的JDBC类型,让Hibernate知道该属性需要通过转换器转换为文本类型:
修改后的实体类属性:
import org.hibernate.type.SqlTypes @Column(name = "iface_ids", columnDefinition = "TEXT") @Convert(converter = StringListToStringConverter::class) @JdbcTypeCode(SqlTypes.LONGVARCHAR) var interfaceIds: List<String> = emptyList()
转换器无需修改:
@Converter class StringListToStringConverter : AttributeConverter<List<String>, String> { override fun convertToDatabaseColumn(attribute: List<String>?): String? { return attribute?.joinToString(",") } override fun convertToEntityAttribute(dbData: String?): List<String>? { return dbData?.split(",")?.filter { it.isNotEmpty() } ?: emptyList() } }
原理说明
两种方案都是让Hibernate正确识别属性的处理逻辑:
- 方案1通过具体实现类,避免Hibernate将其识别为集合映射类型;
- 方案2通过
@JdbcTypeCode明确JDBC类型,强制Hibernate使用AttributeConverter完成类型转换。
内容的提问来源于stack exchange,提问作者Dominic Miglar
相关产品推荐
相关产品推荐

