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

如何将PostgreSQL存储过程返回的JSON数组转换为Java模型类列表

你不需要自定义ObjectMapper实现,Hibernate Types依赖已经内置了兼容的Jackson序列化/反序列化逻辑,按以下步骤调整即可:

1. 调整存储过程调用逻辑

你当前的参数注册、返回值获取方式存在问题,修改后代码如下:

// 导入所需依赖
import com.fasterxml.jackson.core.type.TypeReference;
import com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType;
import com.vladmihalcea.hibernate.type.util.ObjectMapperSupplier;
import javax.persistence.ParameterMode;
import java.util.List;

public List<CreateUserResponse> createUsers(List<CreateUserRequest> createUserRequest ) {
    StoredProcedureQuery query =  (StoredProcedureQuery) this.entityManager.createStoredProcedureQuery("user.create_users")
            // 入参注册保持原有逻辑
            .registerStoredProcedureParameter("create_user_request", CreateUserRequestHibernateType.class, ParameterMode.IN)
            .registerStoredProcedureParameter("created_user", String.class, ParameterMode.IN)
            // 新增返回值注册:PostgreSQL函数返回值对应位置1的OUT参数,指定JSON类型映射
            .registerStoredProcedureParameter(1, JsonNodeBinaryType.class, ParameterMode.OUT);
    
    query.setParameter("create_user_request", createUserRequest.toArray(new CreateUserRequest[0]));
    // 注意不要手动加单引号,JPA会自动处理参数转义,原有写法会导致参数值冗余引号
    query.setParameter("created_user", "spring");
    
    // 先执行存储过程再拿输出参数
    query.execute();
    com.fasterxml.jackson.databind.JsonNode resultJson = (com.fasterxml.jackson.databind.JsonNode) query.getOutputParameterValue(1);
    
    // 直接用Hibernate Types内置的ObjectMapper完成转换,无需自行实例化
    List<CreateUserResponse> responseList = ObjectMapperSupplier.get()
            .readValue(resultJson.traverse(), new TypeReference<List<CreateUserResponse>>() {});
    
    return responseList;
}

2. 确保Model类适配反序列化规则

保证你的自定义模型类存在无参构造,若JSON键名和Java字段名不一致,直接加Jackson注解指定即可,无需修改全局ObjectMapper配置:

public class CreateUserResponse{
    // 键名不匹配时可加注解指定,示例:@JsonProperty("user_info")
    private CreateUserRequest user;
    private String message;

    // 必须保留无参构造,Jackson反序列化依赖该方法
    public CreateUserResponse() {}
}

可选特殊场景配置

如果你有自定义序列化/反序列化规则(比如自定义日期格式、空值处理逻辑),只需要配置好全局ObjectMapper后,通过hibernate.types.jackson.object.mapper配置项指定给Hibernate Types复用即可,不需要单独为这个场景自定义ObjectMapper实现。

内容的提问来源于stack exchange,提问作者Aman Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:36:03