【问题标题】:Get Column Name By Hibernate Query通过休眠查询获取列名
【发布时间】:2012-09-05 10:04:22
【问题描述】:
Query query = this.getSession().createSQLQuery(sqlQuery);       
query.setResultTransformer(new AliasToEntityMapResultTransformer());

List results = query.list();

在上面的代码中,results 包含 Map 的元素,我可以通过 Map 的键获取列名,但正如您所知,query.list() 返回 HashMap 的元素,这就是为什么列名的排序不按顺序排列的原因我想要基于 sql-query 序列的列名排序。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    这是一个非常古老的问题,但是对于为什么变形金刚中还没有这样的东西有点令人烦恼。

    使用转换器运行查询:

    Query sqlQuery = session.createSQLQuery(sqlStatement);
    sqlQuery.setResultTransformer(AliasToEntityLinkedMapResultTransformer.INSTANCE);
    
    List results = query.list();
    

    对于转换器,我扩展了 BasicTransformerAdapter,而不是 AliasToEntityMapResultTransformer。

    import org.hibernate.transform.BasicTransformerAdapter
    
    public class AliasToEntityLinkedMapResultTransformer extends BasicTransformerAdapter implements Serializable {
        public static final AliasToEntityLinkedMapResultTransformer INSTANCE = new AliasToEntityLinkedMapResultTransformer();
    
        private AliasToEntityLinkedMapResultTransformer() {
    
        }
    
        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;
        }
    
        private Object readResolve() {
            return INSTANCE
        }
    
        public boolean equals(Object other) {
            return other != null && AliasToEntityLinkedMapResultTransformer.class.isInstance(other)
        }
    
        public int hashCode() {
            return getClass().getName().hashCode()
        }
    }
    

    没有什么革命性的或直截了当的,但它确实存在。

    【讨论】:

      【解决方案2】:

      实现您自己的AliasToEntityLinkedMapResultTransformer,以AliasToEntityMapResultTransformer 的代码为例,但使用LinkedHashMap 而不是HashMapLinkedHashMap 保留插入顺序。

      【讨论】:

      • 我将如何实现自己的 AliasToEntityLinkedMapResultTransformer
      • 取AliasToEntityMapResultTransformer的源码,改包名和类名,用LinkedHashMap代替HashMap。
      • 类 AliasToEntityLinkedMapResultTransformer 扩展 AliasToEntityMapResultTransformer { public Object TransformTuple(Object[] tuple, String[] aliases) {Map result = new LinkedHashMap(tuple.length); for (int i = 0; i
      • 向我们展示查询,添加跟踪以显示元组和别名数组包含的内容,并向我们展示这些跟踪的结果。
      • @JBNizet 为什么我们需要 LinkedHashMap 或列|值对中的顺序?对不起,如果这听起来很愚蠢,但我无法弄清楚为什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2016-08-25
      相关资源
      最近更新 更多