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的时候才发查找class的sql,会在调用的时候抛出大量的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