Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL查询返回的映射的顺序与查询中指定的顺序不同_Java_Hibernate_Hql - Fatal编程技术网

Java HQL查询返回的映射的顺序与查询中指定的顺序不同

Java HQL查询返回的映射的顺序与查询中指定的顺序不同,java,hibernate,hql,Java,Hibernate,Hql,我正在执行一个HQL查询,如下所示:(HQL查询将是动态的,具有difrent列名、列数、数据类型) 在地图中,我希望获得与在查询中选择的顺序相同的顺序。 在查询中,我选择了id,name,description,locationCountryId,但在地图中,我以不同的顺序获取条目 那么,如何获得查询中指定的相同顺序呢?您可以实现自己的结果变压器,类似于条件指定的变压器。别名\u到\u实体\u映射。您需要使用LinkedHashMap来保留元素的插入顺序,而不是使用HashMap 它可能看起来

我正在执行一个HQL查询,如下所示:(HQL查询将是动态的,具有difrent列名、列数、数据类型)

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


那么,如何获得查询中指定的相同顺序呢?

您可以实现自己的
结果变压器
,类似于
条件指定的变压器。别名\u到\u实体\u映射
。您需要使用
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;
    }
}
import java.util.LinkedHashMap;
导入java.util.Map;
公共类别名ToLinkedEntityMapTransformer扩展
AliasedTupleSubstresultTransformer{
@凌驾
公共对象转换元组(对象[]元组,字符串[]别名){
映射结果=新LinkedHashMap(tuple.length);
for(int i=0;i
不保证地图上的秩序

参考:

请允许我修改您的代码

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"));
 }
for(映射: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”);
}

什么版本的Hibernate?很抱歉,我在问题中没有提到这一点。此处的查询将是动态的,因此我无法获取map.get(key)。我试图用您的代码创建一个类。。别名为SubstresultTransformer。此类不可用。让我进一步了解。对不起,如果我错了,您使用的是什么版本的Hibernate?您的类路径中是否有
hibernate核心
?我的解决方案是基于Hibernate4.3.8的,果然,这个类应该存在:我使用的是maven。org.hibernate hibernate core 3.3.2.GA。hibernate核心在我的eclipse构建路径中。
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;
    }
}
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"));
 }