You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:27