Hibernate使用Transformers.aliasToBean映射JSON字段为DTO的List属性是否可行
可行性结论
完全可行,不过Hibernate默认提供的ResultTransformer不支持自动处理JSON字段到集合类型的转换,需要你自行实现自定义的转换逻辑。
具体实现方案
- 提前在项目中引入JSON序列化工具,比如Jackson、FastJSON都可以,用来把数据库查询到的JSON字符串反序列化为
List<userRequest>类型 - 自定义实现
ResultTransformer接口,在tuple处理阶段手动完成字段映射和JSON反序列化,示例代码如下:
public class UserRequestDTOTransformer implements ResultTransformer { // 以Jackson为例,也可以替换为你用的其他JSON工具 private final ObjectMapper objectMapper = new ObjectMapper(); @Override public Object transformTuple(Object[] tuple, String[] aliases) { // 这里替换为你自己的DTO类名 CustomDTO dto = new CustomDTO(); for (int i = 0; i < aliases.length; i++) { switch (aliases[i]) { case "id": dto.setId((Integer) tuple[i]); break; case "request_payload": String jsonStr = (String) tuple[i]; try { List<userRequest> requestList = objectMapper.readValue(jsonStr, new TypeReference<List<userRequest>>() {}); dto.setUserRequestList(requestList); } catch (JsonProcessingException e) { // 按照你的业务需求处理解析异常,比如设为空集合或者抛出业务异常 dto.setUserRequestList(Collections.emptyList()); } break; default: // 其他字段按需补充逻辑 break; } } return dto; } @Override public List transformList(List collection) { // 不需要对最终列表做处理的话直接返回即可 return collection; } }
- 在查询时指定使用你自定义的Transformer即可拿到符合要求的结果:
// 原生SQL查询示例 List<CustomDTO> result = session.createNativeQuery("select id, request_payload from user_request") .setResultTransformer(new UserRequestDTOTransformer()) .list();
注意事项
不要直接使用Hibernate内置的AliasToBeanResultTransformer,它只能完成基础数据类型的自动映射,碰到JSON字符串转自定义集合的场景会直接报类型不匹配错误,或者返回空值。
内容的提问来源于stack exchange,提问作者karwan
相关产品推荐
相关产品推荐

