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

数据库查询结果转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:50:25