1. 程式人生 > >Object型別轉換成自定義型別(向下轉型)

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在哪裡瞎鼓搗反射就無語...