Object型別轉換成自定義型別(向下轉型)
阿新 • • 發佈:2018-11-25
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在哪裡瞎鼓搗反射就無語...