zoukankan      html  css  js  c++  java
  • 解决JPA hibernate3.6.1结果集字段的乱序问题

    问题现状

    Query query = JPA.em().createNativeQuery(EXECUTESQL);
    //若不设置这一行, list中的元素默认为Object[]类型
    //若设置后, Object[]会转为HashMap, 字段名为key, 字段值为value的形式
    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    query.getResultList();

    问题原因

    //该类作为了setResultTransformer方法的参数
    public class AliasToEntityMapResultTransformer extends BasicTransformerAdapter implements Serializable {
        public static final AliasToEntityMapResultTransformer INSTANCE = new AliasToEntityMapResultTransformer();
    
        private AliasToEntityMapResultTransformer() {
        }
    
        public Object transformTuple(Object[] tuple, String[] aliases) {
            //此处申明的hashMap导致了结果集字段排序打乱
            Map result = new HashMap(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;
        }
    }

    解决方式

    //我们自行实现源码包下面的ResultTransformer接口
    public interface ResultTransformer extends Serializable {
        //该方法用来转化结果集中的元组
        //参数1为元组
        //参数2为对应的字段名数组
        Object transformTuple(Object[] var1, String[] var2);
    
        List transformList(List var1);
    }
    //自己的实现
    package utils.jpa;
    
    import org.hibernate.transform.ResultTransformer;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    public class AliasToEntityLinkHashMapResultTransformer implements ResultTransformer {
        public static final AliasToEntityLinkHashMapResultTransformer INSTANCE = new AliasToEntityLinkHashMapResultTransformer();
    
        @Override
        public Object transformTuple(Object[] tuple, String[] aliases) {
            //此处Map申明为LinkedHashMap, 即可使字段排序保持查询时的顺序
            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 List transformList(List list) {
            return list;
        }
    }

    解决结果

    Query query= JPA.em().createNativeQuery(EXECUTESQL);
    //此处设置使用了我们自行实现的AliasToEntityLinkHashMapResultTransformer类
    //即可使结果集保持查询的顺序
    query.unwrap(SQLQuery.class).setResultTransformer(AliasToEntityLinkHashMapResultTransformer.INSTANCE);
    list = query.getResultList();

    至此, 大功告成!

  • 相关阅读:
    多线程(一) NSThread
    Swift 烧脑体操(一)
    Swift 烧脑体操(二)
    UINavigationController使用的注意事项
    更多请查看我的文章
    本地通知
    网络编程(二)NSURLSessionConfiguration
    A
    51Nod 1116 K进制下的大数(暴力枚举)
    51Nod 1065 最小正子段和
  • 原文地址:https://www.cnblogs.com/wslio/p/14275137.html
Copyright © 2011-2022 走看看