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() + "\t" + "用户名:" + c.getCust_name());
                    //后面就不需要执行了
                    continue;
                }else if(objects[i] instanceof Order){
                    Order od = (Order)objects[i];
                    System.out.println("订单编号:" + od.getOrder_id() + "\t" + "订单明细编号:" + od.getDetail_id());
                    continue;
                }else{
                    System.out.println("object[" + i + "]" + "不是Customer的实例也不是Order的实例~");
                }
            }
            System.out.println("--------------------------------------------------------------------------------------------------------");
        }
        tx.commit();
        session.close();
    }

部分查询结果:

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

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

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

猜你喜欢

转载自www.cnblogs.com/deepSleeping/p/10014431.html
今日推荐