• Object类型转换成自定义类型(向下转型)


    Object类型转换成自定义类型

    场景:

      从数据库或者别的途径接收对象的时候用Object,但是用的时候怎么object点(方法提示 | alt+'/'),都点不出自定义类型的方法。

      比如,数据库查询Customer的时候,用Object来接收,那么想要调用Customer中的getCust_Id()方法,你会发现用Object怎么都点不出来。我之前头疼了很多次,今天做小demo,又碰巧用object接收,运气好的是这次我貌似琢磨出怎么转型了。

    1.转型前(查询出来每条数据由一个Customer对象和Order对象组成,但是用的是Object接收)

      (普通内连接提到的是前两章学习Hibernate的总结(Hibernate(十三)迫切内连接fetch)

    /**
         * 普通内连接
         */
        @Test
        public void fun(){
            Session session = HibernateUtils.getSession();
            Transaction tx = session.beginTransaction();
            
            List<Object[]> list = session.createQuery("from Customer cst inner join cst.ods").list();
            for (Object[] objects : list) {
                System.out.println(Arrays.toString(objects));
            }
            
            tx.commit();
            session.close();
        }

    2.向下转型后(将接收的两个Object对象分别向下转型为Customer和Order对象)

    /**
         * object类型转换成自定义实体类型
         */
        @Test
        public void fun2(){
            Session session = HibernateUtils.getSession();
            Transaction tx = session.beginTransaction();
            //查询用户(因为是普通内连接,所以会每一条数据会封装成两个对象,一个是Customer,一个是Order)
            List<Object[]> list = session.createQuery("from Customer cst inner join cst.ods").list();
            System.out.println("--------------------------------------------------------------------------------------------------------");
            for (Object[] objects : list) {    
                //这里的length是其实就是2
                for(int i = 0;i < objects.length;i++){
                    //如果第i个对象是Customer的实例
                    if (objects[i] instanceof Customer) {
                        //就实例化Customer对象,将第一个object对象向下转型
                        Customer c = (Customer) objects[i];
                        //打印Customer对象中的属性
                        System.out.println("用户ID:" + c.getCust_id() + "	" + "用户名:" + c.getCust_name());
                        //后面就不需要执行了
                        continue;
                    }else if(objects[i] instanceof Order){
                        Order od = (Order)objects[i];
                        System.out.println("订单编号:" + od.getOrder_id() + "	" + "订单明细编号:" + od.getDetail_id());
                        continue;
                    }else{
                        System.out.println("object[" + i + "]" + "不是Customer的实例也不是Order的实例~");
                    }
                }
                System.out.println("--------------------------------------------------------------------------------------------------------");
            }
            tx.commit();
            session.close();
        }

    部分查询结果:

    总结:首先,我感觉我有很多词汇用的不恰当或者概念理解错误,比如,这个应该是向下转型把....

       想明白了还挺开心的(虽然问题有点弱智...),然后再转型之前加上了判断是否是这个类型(instanceof),保证了程序的合理性。

         想到刚刚在哪里,什么Class.forName,什么newInstance,getMethod在哪里瞎鼓捣反射就无语...

  • 相关阅读:
    Web后台框架 目录
    C++ 目录
    【花书笔记】线性代数
    【Python数据挖掘概念、方法与实践】
    【统计学习基础】2. Overview of Supervised Learning
    字节与16进制
    【西瓜书】线性模型
    MySQL入门经典
    【机器学习基石】感知机模型
    python:web应用程序
  • 原文地址:https://www.cnblogs.com/deepSleeping/p/10014431.html
Copyright © 2020-2023  润新知