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在哪里瞎鼓捣反射就无语...