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"));
}
我正在执行这样的 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"));
}