数据库查询结果转LinkedHashMap抛类型转换异常,如何按序输出?
解决查询结果Map无序及强转LinkedHashMap报错的问题
问题原因
AliasToEntityMapResultTransformer.INSTANCE默认返回的是HashMap,而HashMap是无序的,直接将其强制转换为LinkedHashMap会触发类型转换异常——因为实际运行时对象类型是HashMap,无法转为LinkedHashMap。
解决方案
方案一:自定义ResultTransformer返回LinkedHashMap
自定义结果转换器,直接将查询结果按列顺序存入LinkedHashMap:
import org.hibernate.transform.ResultTransformer; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class AliasToLinkedHashMapResultTransformer implements ResultTransformer { public static final AliasToLinkedHashMapResultTransformer INSTANCE = new AliasToLinkedHashMapResultTransformer(); @Override public Object transformTuple(Object[] tuple, String[] aliases) { Map<String, Object> orderedMap = new LinkedHashMap<>(tuple.length); for (int i = 0; i < tuple.length; i++) { String alias = aliases[i]; if (alias != null) { orderedMap.put(alias, tuple[i]); } } return orderedMap; } @Override public List transformList(List collection) { return collection; } }
替换原有转换器,直接获取有序的LinkedHashMap列表:
protected EntityManager em; Query q = em.createNativeQuery("select * from City"); NativeQueryImpl nativeQuery = (NativeQueryImpl) q; // 使用自定义转换器 nativeQuery.setResultTransformer(AliasToLinkedHashMapResultTransformer.INSTANCE); List<LinkedHashMap<String, Object>> r = (List<LinkedHashMap<String, Object>>) nativeQuery.getResultList(); r.stream().forEach(System.out::println);
方案二:将现有HashMap转换为LinkedHashMap
如果不想自定义转换器,可在获取结果后,将每个HashMap转换为LinkedHashMap:
protected EntityManager em; Query q = em.createNativeQuery("select * from City"); NativeQueryImpl nativeQuery = (NativeQueryImpl) q; nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); List<Map<String, Object>> resultList = nativeQuery.getResultList(); // 转换为有序的LinkedHashMap列表 List<LinkedHashMap<String, Object>> orderedList = resultList.stream() .map(hashMap -> new LinkedHashMap<>(hashMap)) .collect(Collectors.toList()); orderedList.forEach(System.out::println);
注意:方案二的可靠性依赖
HashMap的entry迭代顺序,若需严格保证与查询列顺序一致,方案一更稳妥。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

