HQL 查询 returns 与查询中指定的顺序不同的地图

HQL query returns a map which does not have the same order as specified in the query

我正在执行这样的 HQL 查询:(hql 查询将是动态的,具有不同的列名、列数、数据类型)

Session session = getSession();
Query hqlQuery = session.createQuery("select a.id as Id, a.name as Name, a.description as Description, a.locationCountryId as LocationCountryId  from AboutUsMaster as a");
hqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Map<String, String>> myMapList =  hqlQuery.list();
for (Map<String, String> map : myMapList ){
        System.out.println(map.toString());
}

输出:

{Name=Test About, LocationCountryId=1, Description=Description, Id=9}

在地图中,我希望获得与我在查询中 selecting 相同的顺序。 在查询中我 select id, name , description , locationCountryId 但在地图中我以不同的顺序获得条目。

那么如何获取查询中指定的相同订单呢?

您可以实现自己的 ResultTransformer,类似于 Criteria.ALIAS_TO_ENTITY_MAP 指定的那个。您需要使用 LinkedHashMap 来保留元素的插入顺序,而不是使用 HashMap

它可能看起来像这样:

import java.util.LinkedHashMap;
import java.util.Map;

public class AliasToLinkedEntityMapTransformer extends
        AliasedTupleSubsetResultTransformer {

    @Override
    public Object transformTuple(Object[] tuple, String[] aliases) {
        Map<String, Object> result = new LinkedHashMap<>(tuple.length);

        for (int i = 0; i < tuple.length; i++) {
            String alias = aliases[i];

            if (alias != null) {
                result.put(alias, tuple[i]);
            }
        }
        return result;
    }

    @Override
    public boolean isTransformedValueATupleElement(String[] aliases,
            int tupleLength) {

        return false;
    }
}

无法保证地图中的顺序。

参考:Link

请允许我修改您的代码,

for (Map<String, String> map : myMapList ){
    System.out.println(map.get("Id"));
    System.out.println(map.get("Name"));
    System.out.println(map.get("Description"));
    System.out.println(map.get("LocationCountryId"));
 }