Java7环境下使用Java/Jackson将List<Map>转为POJO列表是否有更简便方法?
我使用Hibernate 3执行仅返回指定字段的查询时,找不到直接获取POJO列表的方法,目前最优方案是通过
query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);先得到Map列表。
现在我有一个List<Map<String, Object>>类型的结果集,目前用如下Jackson代码完成到POJO列表的转换:ObjectMapper objectMapper = new ObjectMapper(); MyPojo myPojo; List<MyPojo> res = new ArrayList<>(); // rows是List<Map<String, Object>>类型的结果集 for (Object row : rows) { myPojo = objectMapper.convertValue(row, MyPojo.class); res.add(myPojo); }请问有没有更简便的实现方式?
简便实现方案
方案1:Java 8+ Stream简化现有转换逻辑
如果你的项目使用Java 8及以上版本,不需要引入额外依赖,直接用Stream就能把循环逻辑压缩成链式写法,和原有逻辑的性能完全一致:
// 建议把ObjectMapper抽成类静态常量复用,避免重复创建实例浪费性能 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); // 转换逻辑 List<MyPojo> res = rows.stream() .map(row -> OBJECT_MAPPER.convertValue(row, MyPojo.class)) .collect(Collectors.toList());
方案2:Hibernate查询阶段直接转换POJO(省略Map中转步骤)
你不需要先转Map再转POJO,Hibernate 3原生支持直接把查询结果封装为指定POJO,只需修改ResultTransformer配置即可:
// 查询时直接指定转换目标POJO类 query.setResultTransformer(Transformers.aliasToBean(MyPojo.class)); // 直接拿到POJO列表,不需要额外转换 List<MyPojo> res = query.list();
注意:需要保证查询的字段别名和MyPojo的属性名、类型完全匹配,否则会抛出转换异常。
内容的提问来源于stack exchange,提问作者Marco Sulla
相关产品推荐
相关产品推荐

