在LinkedHashMap中转换HashMap



我正在从数据库中获取结果到List<Map<String, Object>>。问题是值不顺序,所以我想在LinkedHashMap中强制转换,但我得到了这个异常:

javax.ejb.EJBException: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.util.LinkedHashMap (java.util.HashMap and java.util.LinkedHashMap are in module java.base of loader 'bootstrap')

方法如下:

protected EntityManager em;
Query q = em.createNativeQuery("select * from City");
NativeQueryImpl nativeQuery = (NativeQueryImpl) q;
nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<LinkedHashMap<String, Object>> r = (List<LinkedHashMap<String, Object>>) nativeQuery.getResultList();
r.stream().forEach(System.out::println);

有谁知道我如何按顺序打印结果吗?

创建这个类并将其命名为:AliasToEntityMapResultTransformer.INSTANCE

public class MyTransformer extends AliasedTupleSubsetResultTransformer {
public static final MyTransformer INSTANCE = new MyTransformer();
/**
* Disallow instantiation of AliasToEntityMapResultTransformer.
*/
private MyTransformer() {
}
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Map 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;
}
/**
* Serialization hook for ensuring singleton uniqueing.
*
* @return The singleton instance : {@link #INSTANCE}
*/
private Object readResolve() {
return INSTANCE;
}
}

最新更新