Hibernate 查询返回值总结

PDM

Tclass

Tstudent

 

Get和load区别

1.get方式得到学生信息,get以后发出sql语句,得到stu对象

    public void getTstudent(String sno) throwsException{

       this.openConnection();

       Tstudent stu=(Tstudent)this.session.get(Tstudent.class,sno);

       System.out.println("======已经发出sql语句,stu为真实对象");

       System.out.println(stu.getSname());

    }

   


2.load方式得到学生信息,load以后不发sql语句,返回一个代理对象,真正用的时候才去发sql语句取数据

这里的懒加载是针对对象的属性来说的,需要用到该属性采取查找

    public void loadTstudent(String sno) throwsException{

       this.openConnection();

       Tstudent stu=(Tstudent)this.session.load(Tstudent.class, sno);

       System.out.println("======没有发出sql语句,stu为代理对象,值为空");

       System.out.println(stu.getSname());

    }



HQL查询返回值类型

1.查询单个完整实体,返回实体类的所有对象的集合,完整实体即包含所有的属性

    public void getSingleObject() throwsException{

       String hql="from Tstudent";

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Tstudent> objs=q.list();

       for(Tstudentobj:objs){

System.out.println(obj.getSname()+" "+obj.getTclass().getCname());

       }

    }



2.查询多个完整实体,返回所有对象组成的Object[]数组的集合,集合中每个元素是一个Object[]数组,数组的每个元素分别对应查询的每个实体

    public void getManyObject() throwsException{

       String hql="from Tstudent s,Tclass c wheres.tclass.cno=c.cno";

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Object[]> objs=q.list();     

       for(Object[]obj:objs){

           Tstudent s=(Tstudent)obj[0];//数组的第一个是Tstudent

           Tclass c=(Tclass)obj[1];//数组的第二个元素是Tclass

           System.out.print(s.getSname()+" ");

           System.out.println(c.getCname());

       }

    }



3.查询单个字段,返回所有对象这个字段的集合

    public void getSingleField() throwsException{

       String hql="select s.sname from Tstudent s";

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<String> objs=q.list();

       for(Stringobj:objs){

           System.out.println(obj);

       }

    }



4.查询多个字段,返回所有字段组成的Object[]数组的集合,数组中每个元素依次存放这些字段

    public void getManyField() throwsException{

       String hql="select s.sname,s.height from Tstudent s";

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Object[]> objs=q.list();

       for(Object[]obj:objs){

           System.out.print(obj[0]);

           System.out.println(obj[1]);

       }

    }



5.查询单个字段和单个完整实体,返回所有字段组成的Object[]数组的集合,数组中每个元素依次存放这些字段

    public void getSingleObjectAndSingleField() throws Exception{

       String hql="select s,c.cname from Tstudent s,Tclass c wheres.tclass.cname=c.cname";

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Object[]> objs=q.list();

       for(Object[]obj:objs){

           Tstudent s=(Tstudent)obj[0];

//数组的第一个是Tstudent,第二个元素就是cname字段

           System.out.print(s.getSname());

           System.out.println(obj[1]);

       }

    }   



连接查询

1.指定select的实体,这里不能写实体名,必须写别名

默认为懒加载策略这里的懒加载是需要针对连接的表,需要数据的时候才加载这个表

    public void getJoin_Select() throwsException{  

 

//     内连接//selects默认查出来是单个对象,返回所有对象的集合

//     String hql="select s from Tstudent sinner join s.tclass";//懒加载需要class的时候才发查找classsql,会在调用的时候抛出大量的sql查询给服务器造成压力,可以在配置文件中配置fetch属性为join,也可以在hql语句中进行重写

//     迫切内连接

       String hql="select s from Tstudent s inner join fetchs.tclass";//一次性查找抛出所有sql语句,代码中的fetch会覆盖映射文件的检索策略

      

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Tstudent> objs=q.list();

       for(Tstudentobj:objs){

System.out.println(obj.getSname()+" "+obj.getTclass().getCname());

       }

    }



2.不指定select的实体

默认fetch策略,没有懒加载策略

    public void getJoin_NoSelect() throwsException{

//     内连接

       String hql="from Tstudent s inner join s.tclass";

//不写selects默认查出来是两个完整实体对象,需要放到数组中,再往集合里放

       this.openConnection();

       Query q = this.session.createQuery(hql);

       List<Object[]> objs=q.list();     

       for(Object[]obj:objs){

           Tstudent s=(Tstudent)obj[0];//数组的第一个是Tstudent

           Tclass c=(Tclass)obj[1];//数组的第二个元素是Tclass

           System.out.print(s.getSname()+" ");

           System.out.println(c.getCname());

       }

    }



小细节

占位符匹配注意这里不能直接sno,因为hql是面向对象的,sno是对象的属性

Stringhql="from Tstudent s wheres.sno =?";

参数匹配 hql中,参数前要加“:”

Stringhql="from Tstudent s wheres.sno=:sno";

当返回值唯一的话,不要用list(),直接用uniqueResult(),前者对象不存在会抛越界异常,后者则返回null

System.out.println (q.list().get(0));

System.out.println(((Tstudent)q.uniqueResult()).getSname());

 

cascade和inverse应用

一对多

添加班级后自动添加该班级的学生

需要在Tclass.hbm.xml中配置 inverse="false"cascade="save-update"

主要是tclass.setTstudents(stus);//建立一对多映射   

 

多对一

添加学生后,班级编号自动添加

需要在Tstudent.hbm.xml配置cascade="save-update",不用配置inverse,也不能配置,因为班级和学生一方配置了就可以

主要是for(Tstudent s: stus){s.setTclass(tclass);}//建立多对一的映射

 

cascade和inverse详解参考:http://www.cnblogs.com/whgk/p/6135591.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值