Spring Boot Kotlin中JPA原生查询转换自定义实体报错咨询
问题解答:原生SQL查询无法映射到自定义Data Class
这不是JPA的Bug,问题出在Spring Data JPA无法自动将原生SQL返回的TupleBackedMap结构映射到你的自定义NewResult数据类,需要显式配置映射规则。以下是几种可行的解决方案:
解决方案一:使用@SqlResultSetMapping和@ConstructorResult
这是JPA标准的结果映射方式,适配data class接收查询结果的场景:
- 在任意关联实体类(比如你的
SomeClass)上定义结果集映射:
@Entity @SqlResultSetMapping( name = "NewResultMapping", classes = [ ConstructorResult( targetClass = NewResult::class, columns = [ ColumnResult(name = "sectionCode", type = String::class), ColumnResult(name = "sectionDescription", type = String::class) ] ) ] ) class SomeClass(/* 你的实体原有字段 */)
- 在仓库方法的
@Query注解中指定该映射:
interface NewRepository: JpaRepository<SomeClass, UUID> { @Query( nativeQuery = true, value = """ select f.section_code as sectionCode, m.section_description as sectionDescription from table1 f join table2 m on m.code_id = f.id """, resultSetMapping = "NewResultMapping" ) fun search(): List<NewResult> }
解决方案二:改用Spring Data Projection(接口形式)
如果不需要data class的可变属性等特性,可以将NewResult定义为接口,Spring会自动代理实现并映射结果:
- 定义Projection接口:
interface NewResult { fun getSectionCode(): String fun getSectionDescription(): String }
- 仓库方法保持原查询语句,直接返回
List<NewResult>即可:
interface NewRepository: JpaRepository<SomeClass, UUID> { @Query(nativeQuery = true, value = """ select f.section_code as sectionCode, m.section_description as sectionDescription from table1 f join table2 m on m.code_id = f.id """) fun search(): List<NewResult> }
解决方案三:自定义类型转换器
通过实现Spring的Converter接口,手动完成TupleBackedMap到NewResult的转换:
- 创建转换器类并注册为Spring组件:
import org.springframework.core.convert.converter.Converter import org.springframework.data.jpa.repository.query.AbstractJpaQuery import org.springframework.stereotype.Component @Component class TupleBackedMapToNewResultConverter : Converter<AbstractJpaQuery.TupleConverter.TupleBackedMap, NewResult> { override fun convert(source: AbstractJpaQuery.TupleConverter.TupleBackedMap): NewResult { return NewResult( sectionCode = source["sectionCode"] as String, sectionDescription = source["sectionDescription"] as String ) } }
- 仓库方法无需修改,Spring会自动识别并使用该转换器完成映射。
内容的提问来源于stack exchange,提问作者Sankalp Bhatt
相关产品推荐
相关产品推荐

