zoukankan      html  css  js  c++  java
  • spring data jpa自定义bean字段映射

    当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最终还是没成功。故选择了另一种方式来解决。

         String sql = "select a.name,b.className,a.createTime from A a left join B b on a.id = b.id";
         Query query = entityManager.createNativeQuery(sql);     //此方法是将数据集合转换位map类型的List集合
        //query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class)); List<Object[]> resultList = query.getResultList(); List<MyEntity> list = CommonUtils.castEntity(resultList, MyEntity.class);

    使用entityManage创建nativeQuery,此时获取到的结果集返回的数据是 List<Object[]> 类型的,由于我所需要的字段仅只有name,className,createTime,故构造对应的bean。

    public class MyEntity {
    
        private String name;
    
        private String className;
    
        private Long createTime;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        public Long getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Long createTime) {
            this.createTime = createTime;
        }
      //必须构建的构造方法,含有查询列所有的对应的字段
        public MyEntity(String name, String className, BigInteger createTime) {
            this.name = name;
            this.className = className;
            this.createTime = createTime != null ? createTime.longValue() : null ;
        }
    
        public MyEntity() {
        }
    }

    由于数据库中createTime保存的是Long型,发现用 entityManager 获取到的是 BigInteger ,故构造方法的参数类型设为BigInteger,是为了便于数据做转换。

    /**
         * 数组集合转化为指定对象集合
         * 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应
         * @param list
         * @param clazz
         * @param <T>
         * @return
         * @throws Exception
         */
        public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {
            List<T> returnList = new ArrayList<>();
            if (list.size() == 0){
                return returnList;
            }
            Class[] c2 = null;
            Constructor[] constructors = clazz.getConstructors();
            for (Constructor constructor : constructors){
                Class[] tClass = constructor.getParameterTypes();
                if (tClass.length == list.get(0).length){
                    c2 = tClass;
                    break;
                }
            }
            //构造方法实例化对象
            for(Object[] o : list){
                Constructor<T> constructor = clazz.getConstructor(c2);
                returnList.add(constructor.newInstance(o));
            }
    
            return returnList;
        }

    上面方法则是对数据进行了转换,通过反射构造方法进行实例化对象。返回目标类型的List集合。

  • 相关阅读:
    模拟实现bind、call、apply函数
    模拟实现ECMAScript5新增的数组方法
    HBuilder mui页面间传值的几种方式
    手机端软键盘弹出挤压页面的问题
    js获取当前时间
    原生js根据class获取元素的方法
    jquery之获取select选中的值
    原生js获取元素属性值方法
    利用javascrit获取url传递的参数
    jQuery图片预加载(延迟加载)之插件Lazy Load
  • 原文地址:https://www.cnblogs.com/suiyueqiannian/p/6626414.html
Copyright © 2011-2022 走看看