如何将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
相关产品推荐
相关产品推荐

