首页 > 解决方案 > Java nativeQuery:带有 AliasToEntityMapResultTransformer 的 ResultSet 在地图中具有无序列

问题描述

我正在尝试将结果集作为地图获取,并且我成功地将其放入地图中。但是地图键不是按照选择查询的顺序

请检查代码:

String queryString = "SELECT T1.COLUMN_11, T1.COLUMN_12, T2.COLUMN_21, T2.COLUMN_22 FROM MYSCHEMA.TABLE1 T1 INNER JOIN MYSCHEMA.TABLE2 T2 ON T1.SOME_COLUMN = T2.SOME_OTHER_COLUMN";

Query query = entityManager.createNativeQuery(queryString)
                       .unwrap(org.hibernate.query.Query.class)
                       .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
        
List<Map<String, Object>> resultSet = queryEx.getResultList();

现在按照预期List<Map<String, Object>> resultSet应该如下所示

[
  {
    "COLUMN_11": "VALUE11",
    "COLUMN_12": "VALUE12",
    "COLUMN_21": "VALUE21",
    "COLUMN_22": "VALUE22"
  },
  ...............
]

但是这些列是混乱的,如下所示

[
  {
    "COLUMN_21": "VALUE21",
    "COLUMN_12": "VALUE12",
    "COLUMN_11": "VALUE11",
    "COLUMN_22": "VALUE22"
  },
  ...............
]

无论如何我可以保留选择语句中的订单吗?

PS:无法创建模型来保存结果集值,因为查询是动态的。所以“必须”只使用地图。

标签: javahibernatejpanativequeryhibernate-native-query

解决方案


尝试删除.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE). 我不是 Hibernate 专家,但大多数 JPA 实现默认返回一个对象数组列表,这些数组保留列的顺序。

另一种方法是实现您自己的转换器,使用 LinkedHashMap 而不是 HashMap。AliasToEntityMapResultTransformer使用 HashMap。


推荐阅读