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

Object类型转换成自定义类型(向下转型)的更多相关文章

  1. 如何将Object类型转换成String类型

    1. Object.toString() obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)Obj ...

  2. java从Object类型转换成double类型

    java从Object类型转换为double类型: Map<String,Object> map = new HashMap<String,Object>(); map.put ...

  3. Java 类型转换以及Object转成其他类型

    Object转int int count=(int)map.get("count") int count=Integer.parseInt((String)map.get(&quo ...

  4. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

  5. oracle Clob类型转换成String类型

    转载:https://www.cnblogs.com/itmyhome/p/4131339.html Clob类型转换成String类型 oracle中表结构如下: create table GRID ...

  6. sqlserver搜索中怎么把varchar类型转换成numeric类型

    sqlserver搜索中怎么把varchar类型转换成numeric类型 可以用cast来转换 如:列名叫grade,表名为A select cast(grade as numeric(y,x)) f ...

  7. Java byte类型转换成int类型时需要 & 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

  8. C++类型转换 -- 由其他类型转换到自定义类型

    由其他类型转换到自定义类型 由其他类型(如int,double)向自定义类的转换是由构造函数来实现,只有当类的定义和实现中提供了合适的构造函数,转换才能通过. /******************* ...

  9. 基本类型转换成NSNumber类型

    int i=100; float f=2.34; NSNumber *n1=[NSNumber numberWithInt:i]; NSNumber *n2=[NSNumber numberWithF ...

随机推荐

  1. delphi 窗体最大化 最小化

    procedure TForm1.SpeedButton2Click(Sender: TObject); begin sendmessage(form1.WindowHandle,WM_SYSCOMM ...

  2. shell脚本执行错误 $'\r':command not found

    shell脚本执行错误 $'\r':command not found Linux下有命令dos2unix 可以用一下命令测试 vi -b filename 我们只要输入dos2unix *.sh就可 ...

  3. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  4. Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件

    DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...

  5. Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测

    能力检测 浏览器厂商虽然在实现公共接口方面投入了大量的精力 但是每种浏览器仍旧存在许多差异 为了让网页能跨浏览器的运行,对浏览器差异做的兼容处理自然无法避免 其中最常用的也就是我们现在所说的能力检测 ...

  6. 移动端点击事件300ms延迟问题解决方案——fastclick.js

    移动端点击事件300ms延迟的问题由来已久,如下截图 下面截图来自原文:https://www.jianshu.com/p/6e2b68a93c88 网上关于300ms延迟问题的解决方法,大致分为 3 ...

  7. 【详记MySql问题大全集】三、安装之后没有my.ini配置文件怎么办

    系列目录 一.安装MySql 二.安装并破解Navicat 三.没有my.in配置文件怎么办 四.设置MySql的大小写敏感 五.重置MySql登陆密码 之前说过,Windows操作系统中,我们安装M ...

  8. shell 中let无法使用的原因

    运行 sh    let.sh 时,却显示  let: not found 百度之后知道: /bin/sh指向了dash而不是bash,dash不支持let命令. 解决方法: 法1.使用  bash ...

  9. Python中使用PyCharm为函数及参数增加注释

    在函数名中键入数遍光标,左上角亮起小灯泡,点击小灯泡 选中第二行内容 在"""后添加函数注释,以及参数注释 然后再引用函数时,选中函数,Ctrl q  即可显示函数以及参 ...

  10. Oracle的条件in包含NULL时的处理

    一.创建一个含表,表中只有一列为id,该列中含有值为NULL的记录 我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面 ...