Spring Boot 3.0中Spring JPA JSON字段字符串匹配查询报错
问题描述
在Spring Boot 3.0 + Hibernate应用中,定义了如下Employer实体类:
@Entity @Table(name = "employers") class Employer( @Id val id: Long, @Type(JsonType::class) @Column(columnDefinition = "json") val jsondata: String )
尝试通过Spring Data JPA执行原生查询:
@Query( value = "select * from employers where e.jsondata::text = :jsondata", nativeQuery = true ) fun findByJsonData(@Param("jsondata") jsondata: String)
运行时抛出错误:
Cannot invoke "org.hibernate.metamodel.mapping.JdbcMapping.getJdbcValueBinder()" because "jdbcMapping" is null
但在PostgreSQL 14.4控制台执行相同SQL可正常返回结果:
select * from employers e where e.jsondata::text = '{"id":1}'
解决方案
1. 修正SQL的表别名错误
代码中的原生SQL使用了别名e,但from employers后未定义该别名,先修正SQL语句:
@Query( value = "select * from employers e where e.jsondata::text = :jsondata", nativeQuery = true ) fun findByJsonData(@Param("jsondata") jsondata: String): List<Employer>
2. 适配Hibernate 6.x的JSON类型映射
Spring Boot 3.0搭配Hibernate 6.x,原@Type(JsonType::class)的用法已不再推荐,改用@JdbcTypeCode实现更稳定的类型绑定:
@Entity @Table(name = "employers") class Employer( @Id val id: Long, @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "json") val jsondata: String )
该注解能让Hibernate明确识别JSON字段的JDBC类型,避免映射时出现jdbcMapping空指针问题。
3. 改用JSON原生比较逻辑(可选优化)
无需将JSON字段转成文本比较,直接用PostgreSQL的JSON类型语法匹配,类型映射更精准:
@Query( value = "select * from employers e where e.jsondata = cast(:jsondata as json)", nativeQuery = true ) fun findByJsonData(@Param("jsondata") jsondata: String): List<Employer>
4. 明确方法返回类型
确保查询方法指定返回类型(如List<Employer>或Employer?),否则Spring Data JPA无法正确处理结果映射。
内容的提问来源于stack exchange,提问作者asfarasiknow
相关产品推荐
相关产品推荐

