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