Hibernate-HQL基础

Hibernate-HQL基础                                                   

            标签:               hibernatehql详解                     

    
      

             分类:        
                           
 
 

Hibernate-HQL基础

 

基本概述

 

    Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此HibernateHQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。

 

HQL详解

    这里以学生选课系统的表为例,讲解HQL。现提供三张表的SQL语句以及映射图。

 

  1. --建立学生表  
  2. create table student  
  3. (  
  4.        sid number primary key , --学号  
  5.        sname varchar2(45) not null, --学生姓名  
  6.        ssex  char(2) not null,--性别  
  7.        sdept varchar2(10) not null, --所在系  
  8.        sage  number(3) ,--年龄  
  9.        saddress varchar2(45) --住址  
  10. );  
  11.   
  12. --学生表中的数据  
  13. insert into student values(20040001,'林青霞','F','计算机系',22,'上海');  
  14. insert into student values(20040002,'刘德华','M','外语系',23,'南京');  
  15. insert into student values(20050003,'成龙','M','化学系',21,'山东');  
  16. insert into student values(20050004,'林可欣','F','计算机系',22,'北京');  
  17. insert into student values(20050005,'周华健','M','生物系',24,'山东');  
  18. insert into student values(20050006,'周润发','M','数学系',20,'湖北');  
  19.   
  20. --建立课程表  
  21. create table course  
  22. (  
  23.        cid number primary key ,--这是课程号  
  24.        cname varchar2(50) not null,--课程名  
  25.        ccredit number(3) --课程学分  
  26. );  
  27.   
  28. insert into course values(11,'java编程',6);  
  29. insert into course values(21,'c++课程',4);  
  30. insert into course values(31,'oracle',3);  
  31. insert into course values(41,'javaEE',100);  
  32. insert into course values(51,'linux',1);  
  33.   
  34. --建立选课表  
  35. create table studCourse  
  36. (  
  37.        stuCourseId number primary key ,--这是一个自增的,表示一次选课  
  38.        sid number  references student(sid),--学生号  
  39.        cid number references course(cid),--课程号  
  40.        grade number not null--成绩  
  41. );  
  42.   
  43. -- 建立选课序列  
  44. create sequence stucourse_seq  
  45. start with 1  
  46. increment by 1  
  47. minvalue 1  
  48. nomaxvalue  
  49. nocycle  
  50. nocache  
  51. ;  
  52.   
  53. --初始化数据  
  54. insert into studCourse values(stucourse_seq.nextval,20040001,11,90);  
  55. insert into studCourse values(stucourse_seq.nextval,20040001,21,19);  
  56. insert into studCourse values(stucourse_seq.nextval,20050003,21,45);  
  57. insert into studCourse values(stucourse_seq.nextval,20050004,41,99);  
  58. insert into studCourse values(stucourse_seq.nextval,20050006,11,39);  
--建立学生表
create table student
(
       sid number primary key , --学号
       sname varchar2(45) not null, --学生姓名
       ssex  char(2) not null,--性别
       sdept varchar2(10) not null, --所在系
       sage  number(3) ,--年龄
       saddress varchar2(45) --住址
);

--学生表中的数据
insert into student values(20040001,'林青霞','F','计算机系',22,'上海');
insert into student values(20040002,'刘德华','M','外语系',23,'南京');
insert into student values(20050003,'成龙','M','化学系',21,'山东');
insert into student values(20050004,'林可欣','F','计算机系',22,'北京');
insert into student values(20050005,'周华健','M','生物系',24,'山东');
insert into student values(20050006,'周润发','M','数学系',20,'湖北');

--建立课程表
create table course
(
       cid number primary key ,--这是课程号
       cname varchar2(50) not null,--课程名
       ccredit number(3) --课程学分
);

insert into course values(11,'java编程',6);
insert into course values(21,'c++课程',4);
insert into course values(31,'oracle',3);
insert into course values(41,'javaEE',100);
insert into course values(51,'linux',1);

--建立选课表
create table studCourse
(
       stuCourseId number primary key ,--这是一个自增的,表示一次选课
       sid number  references student(sid),--学生号
       cid number references course(cid),--课程号
       grade number not null--成绩
);

-- 建立选课序列
create sequence stucourse_seq
start with 1
increment by 1
minvalue 1
nomaxvalue
nocycle
nocache
;

--初始化数据
insert into studCourse values(stucourse_seq.nextval,20040001,11,90);
insert into studCourse values(stucourse_seq.nextval,20040001,21,19);
insert into studCourse values(stucourse_seq.nextval,20050003,21,45);
insert into studCourse values(stucourse_seq.nextval,20050004,41,99);
insert into studCourse values(stucourse_seq.nextval,20050006,11,39);

 

PS:在设计表的时候,应当每张表都有一个主键,且该主键最好不含业务逻辑。

1、查询类的全部属性

基本语法:

    from Domain类名

案例:

    from Student -- 查询Student表中所有数据

 

2、查询类的部分属性

基本语法:

    select 属性1,属性2 from Domain类名

案例:

    select sname,sage from Student

 

3、取出单条记录

基本语法:

  1. session.createQuery(“from xxx where id=123456”).uniqueResult();  
    session.createQuery(“from xxx where id=123456”).uniqueResult();

案例:

  1. Student s=(Student) session.createQuery("from Student where sid = 20050003").uniqueResult();  
    Student s=(Student) session.createQuery("from Student where sid = 20050003").uniqueResult();

PS:如果检索一个对象,明确知道最多只有一个对象,则建议使用该方法。

4、过滤重复值

基本语法:

    select distinct 属性1,属性2 from Domain类名

案例:

  1. List list=session.createQuery("select distinct sage,ssex from Student").list();  
  2. for(int i=0;i<list.size();i++){  
  3.     Object []  objs=(Object[]) list.get(i);  
  4.     System.out.println(objs[0].toString()+" "+objs[1].toString());  
  5. }  
List list=session.createQuery("select distinct sage,ssex from Student").list();
for(int i=0;i<list.size();i++){
	Object []  objs=(Object[]) list.get(i);
	System.out.println(objs[0].toString()+" "+objs[1].toString());
}

PS:通过使用distinct可以过滤掉重复的数据。

5、取某个范围类的记录

基本语法:

    [select 属性列表] from Domain类名 where 属性名 between 数值下界 and 数值上界

案例:

  1. List list=session.createQuery("select distinct sage,ssex,sname from Student where sage between 20 and 22").list();  
  2. for(int i=0;i<list.size();i++){  
  3.     Object []  objs=(Object[]) list.get(i);  
  4.     System.out.println(objs[0].toString()+" "+objs[1].toString()+objs[2].toString());  
  5. }  
List list=session.createQuery("select distinct sage,ssex,sname from Student where sage between 20 and 22").list();
for(int i=0;i<list.size();i++){
	Object []  objs=(Object[]) list.get(i);
	System.out.println(objs[0].toString()+" "+objs[1].toString()+objs[2].toString());
}

6、存在或不存在与记录里

基本语法:

    [select 属性列表] from Domain类名 where 属性名 in[not in](‘条件1’,’条件2’,’条件3’)

案例:

  1. List<Student> list=session.createQuery("from Student where sdept in ('计算机系','外语系')").list();  
  2. //取出  for 增强  
  3. for(Student s:list){  
  4.     System.out.println(s.getSname()+" "+s.getSaddress()+" "+s.getSdept());  
  5. }  
List<Student> list=session.createQuery("from Student where sdept in ('计算机系','外语系')").list();
//取出  for 增强
for(Student s:list){
	System.out.println(s.getSname()+" "+s.getSaddress()+" "+s.getSdept());
}

7、模糊查询

基本语法:

    [select 属性列表] from Domain类名 where 属性名 like ‘字符串’

案例:

    from Student where sname like ‘林%’

 

8group byhavingorder by,聚集函数使用

案例1

  1. //显示各个系的学生的平均年龄  
  2. List<Object[]> list=session.createQuery("select avg(sage),sdept from  Student group by sdept").list();  
  3. //取出1. for 增强  
  4. for(Object[] obj:list){  
  5.     System.out.println(obj[0].toString()+" "+obj[1].toString());  
  6. }  
//显示各个系的学生的平均年龄
List<Object[]> list=session.createQuery("select avg(sage),sdept from  Student group by sdept").list();
//取出1. for 增强
for(Object[] obj:list){
	System.out.println(obj[0].toString()+" "+obj[1].toString());
}

案例2

  1. //1.对分组查询后的结果,进行筛选:比如请显示人数大于3的系名称  
  2. //a. 查询各个系分别有多少学生.  
  3. List<Object[]> list=session.createQuery("select count(*) as c1,sdept from  Student group by sdept having count(*)>3").list();  
  4. //取出1. for 增强  
  5. for(Object[] obj:list){  
  6.     System.out.println(obj[0].toString()+" "+obj[1].toString());  
  7. }  
//1.对分组查询后的结果,进行筛选:比如请显示人数大于3的系名称
//a. 查询各个系分别有多少学生.
List<Object[]> list=session.createQuery("select count(*) as c1,sdept from  Student group by sdept having count(*)>3").list();
//取出1. for 增强
for(Object[] obj:list){
	System.out.println(obj[0].toString()+" "+obj[1].toString());
}

案例3

  1. //2查询女生少于200人的系  
  2. //a.查询各个系的女生有多个个  
  3. List<Object[]> list=session.  
  4. createQuery("select count(*) as c1,sdept from Student where ssex='F' group by sdept").list();  
  5. //取出1. for 增强  
  6. for(Object[] obj:list){  
  7.     System.out.println(obj[0].toString()+" "+obj[1].toString());  
  8. }  
//2查询女生少于200人的系
//a.查询各个系的女生有多个个
List<Object[]> list=session.
createQuery("select count(*) as c1,sdept from Student where ssex='F' group by sdept").list();
//取出1. for 增强
for(Object[] obj:list){
	System.out.println(obj[0].toString()+" "+obj[1].toString());
}

案例4

  1. //1.查询计算机系共多少人?->如果我们返回的是一列数据  
  2. //这时我们的取法是直接取出list->object 而不是 list->Object[]  
  3. List<Object[]> list=session.createQuery("select sage from  Student where sdept='计算机系'").list();  
  4. //取出1. for 增强  
  5. for(Object obj:list){  
  6.     System.out.println(obj.toString());  
  7. }  
//1.查询计算机系共多少人?->如果我们返回的是一列数据
//这时我们的取法是直接取出list->object 而不是 list->Object[]
List<Object[]> list=session.createQuery("select sage from  Student where sdept='计算机系'").list();
//取出1. for 增强
for(Object obj:list){
    System.out.println(obj.toString());
}

案例5

  1. //3.查询选修11号课程的最高分和最低分.  
  2. List<Object[]> list=session.  
  3. createQuery("select 11,max(grade),min(grade) from Studcourse where course.cid=11").list();  
  4. //取出1. for 增强  
  5. for(Object[] obj:list){  
  6.     System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());  
  7. }  
//3.查询选修11号课程的最高分和最低分.
List<Object[]> list=session.
createQuery("select 11,max(grade),min(grade) from Studcourse where course.cid=11").list();
//取出1. for 增强
for(Object[] obj:list){
    System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());
}

案例6

  1. //计算各个科目不及格的学生数量  
  2. List<Object[]> list=session.createQuery("select count(*),student.sdept from Studcourse where grade<60 group by student.sdept").list();  
  3. //取出1. for 增强  
  4. for(Object[] obj:list){  
  5.     System.out.println(obj[0].toString()+" "+obj[1].toString());  
  6. }  
//计算各个科目不及格的学生数量
List<Object[]> list=session.createQuery("select count(*),student.sdept from Studcourse where grade<60 group by student.sdept").list();
//取出1. for 增强
for(Object[] obj:list){
	System.out.println(obj[0].toString()+" "+obj[1].toString());
}

PSgroup by用于分组,having在分组后加限制条件,order by指定排序方式,聚集函数有count(),avg(),max(),min(),sum()五个,大部分内容和SQL中语法相似,给出以前相关内容的博客:Oracle表管理Java数据库基础

9、实际应用之分页显示

  1. public void showStuByPage(int pageSize,int pageNow){  
  2.     Query q = session.createQuery(“from Student”);   
  3.     q.setFirstResult((pageNow - 1) * pageSize); //从第几条取  
  4.     q.setMaxResult(pageSize);   //取出几条  
  5.     List list = q.list();        //执行     
  6.     Iterator it=list.iterator();    //显示一下  
  7.     while(it.hasnext){  
  8.         Student s=(Student)it.next();  
  9.         System.out.println(s.getSname());  
  10.         System.out.println(s.getSage());  
  11.     }   
  12.     String hql=“select count(*) from Student”;  
  13.     list=session.createQuery(hql).list();  
  14.     int pageRow=((Integer)list.get(0)).intValue();  
  15.     int pageCount=(pageRow+pageSize-1)/pageSize;//总页数  
  16.     }  
public void showStuByPage(int pageSize,int pageNow){
	Query q = session.createQuery(“from Student”); 
	q.setFirstResult((pageNow - 1) * pageSize); //从第几条取
	q.setMaxResult(pageSize); 	//取出几条
	List list = q.list();		 //执行	
	Iterator it=list.iterator(); 	//显示一下
	while(it.hasnext){
		Student s=(Student)it.next();
		System.out.println(s.getSname());
		System.out.println(s.getSage());
	} 
	String hql=“select count(*) from Student”;
	list=session.createQuery(hql).list();
	int pageRow=((Integer)list.get(0)).intValue();
	int pageCount=(pageRow+pageSize-1)/pageSize;//总页数
	}

10、参数绑定

参数绑定的两种形式:

1:参数名

基本语法:

    Query q = session.createQuery(from Domain类名 where 属性1=:参数1);

    q.setParameter(“参数1”, ”值1”);

案例:

  1. List<Student> list=session.createQuery("from Student where sdept=:a1 and sage >: sage").setString("a1", "计算机系").setString("sage", "2").list();  
    List<Student> list=session.createQuery("from Student where sdept=:a1 and sage >: sage").setString("a1", "计算机系").setString("sage", "2").list();

或者可以:

  1. Query q = session.createQuery("from Student where sdept=:a1 and sage >: sage");   
  2. q.setString("a1", "计算机系");  
  3. q.setString("sage", "2");  
    Query q = session.createQuery("from Student where sdept=:a1 and sage >: sage"); 
    q.setString("a1", "计算机系");
    q.setString("sage", "2");
2、“?”形式

基本语法:

    Query q = session.createQuery(from Domain类名 where 属性1=?);

    q.setParameter(“0”, ”值1”);

案例:

  1. List<Student> list = session.createQuery("from Student where sdept=? and sage>?").setString(0, "计算机系").setString(1, "2").list();  
    List<Student> list = session.createQuery("from Student where sdept=? and sage>?").setString(0, "计算机系").setString(1, "2").list();

或者是:

  1.    Query query=session.createQuery("from Student where sdept=? and sage>?");  
  2. query.setString(0, "计算机系");  
  3. query.setString(1, "2");  
  4. List <Student> list=query.list();  
  5. for(int i=0;i<list.size();i++){  
  6.     Student s= list.get(i);  
  7.     System.out.println(s.getSname()+" "+s.getSage());  
  8. }  
    Query query=session.createQuery("from Student where sdept=? and sage>?");
	query.setString(0, "计算机系");
	query.setString(1, "2");
	List <Student> list=query.list();
	for(int i=0;i<list.size();i++){
		Student s= list.get(i);
		System.out.println(s.getSname()+" "+s.getSage());
	}

使用参数绑定的好处

1.可读性好.

2.性能提高.

3.防止sql注入.

11、在映射文件中得到HQL语句

案例:

: Student.hbm.xml 

  1. <query name="myquerytest">  
  2.     <![CDATA[select sname,ssex from Student where sage>22]]>  
  3. </query>  
<query name="myquerytest">
	<![CDATA[select sname,ssex from Student where sage>22]]>
</query>

使用方法:

  1. List list=session.getNamedQuery("myquerytest").list();  
  2. System.out.println(list.size());  
  3. Iterator it=list.iterator();  
  4. while(it.hasNext()){  
  5.     Object obj[]=(Object[])it.next();  
  6.     System.out.println("n="+obj[0]);  
  7. }  
List list=session.getNamedQuery("myquerytest").list();
System.out.println(list.size());
Iterator it=list.iterator();
while(it.hasNext()){
	Object obj[]=(Object[])it.next();
	System.out.println("n="+obj[0]);
}

PS:通过在映射文件中配置hql,可以使hql的查询更灵活。

12、子查询

案例:显示所有选择了21号课程的学生信息

from Student where sid in (select student.sid from StudCourse where course.cno='21')

13、多表查询

案例:显示林青霞选择的所有课程名和成绩

select s1.sname,s2.course.cid,c1.cname,s2.grade from Student as s1,StudCourse as s2,Course as c1 where s1.sname='林青霞' and s1.sname=s2.student.sname and c1.cid=s2.course.cid

或者

select s1.course.cname,s1.grade from Studcourse s1 where s1.student.sname='林青霞'

 

补充:Criteria的使用

案例:

  1. //查询年龄大于10岁的学生 criteria  
  2. Session s=HibernateUtil.getCurrentSession();  
  3. Transaction tx=s.beginTransaction();  
  4. Criteria cri=s.createCriteria(Student.class);  
  5. //添加检索条件  
  6. cri.add(Restrictions.gt("sage", new Long(10)));  
  7. List<Student> list=cri.list();  
  8. for(Student s1: list){  
  9.     System.out.println(s1.getSname());  
  10. }  
  11. tx.commit();         
//查询年龄大于10岁的学生 criteria
Session s=HibernateUtil.getCurrentSession();
Transaction tx=s.beginTransaction();
Criteria cri=s.createCriteria(Student.class);
//添加检索条件
cri.add(Restrictions.gt("sage", new Long(10)));
List<Student> list=cri.list();
for(Student s1: list){
	System.out.println(s1.getSname());
}
tx.commit();       

PSCriteria的优点是更加面向对象,如果对hql语句不太了解的话可以使用。缺点是功能不如hql强大,而且hqlhibernate官方推荐使用的语句。

 

----------参考《韩顺平.hibernate从入门到精通》

 

Hibernate-HQL基础    .


标签: hibernatehql详解  

2016-02-14 00:10 1365人阅读 评论(2) 收藏 举报 
.  

 分类: 

Hibernate(13)   


 .

版权声明:如需转载,请联系本人获取许可且必须注明出处,详见联系方式。



目录(?)[+]
























Hibernate-HQL基础



基本概述


    Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。

 

HQL详解

    这里以学生选课系统的表为例,讲解HQL。现提供三张表的SQL语句以及映射图。










[sql] view plain copy 
01.--建立学生表  
02.create table student  
03.(  
04.       sid number primary key , --学号  
05.       sname varchar2(45) not null, --学生姓名  
06.       ssex  char(2) not null,--性别  
07.       sdept varchar2(10) not null, --所在系  
08.       sage  number(3) ,--年龄  
09.       saddress varchar2(45) --住址  
10.);  
11.  
12.--学生表中的数据  
13.insert into student values(20040001,'林青霞','F','计算机系',22,'上海');  
14.insert into student values(20040002,'刘德华','M','外语系',23,'南京');  
15.insert into student values(20050003,'成龙','M','化学系',21,'山东');  
16.insert into student values(20050004,'林可欣','F','计算机系',22,'北京');  
17.insert into student values(20050005,'周华健','M','生物系',24,'山东');  
18.insert into student values(20050006,'周润发','M','数学系',20,'湖北');  
19.  
20.--建立课程表  
21.create table course  
22.(  
23.       cid number primary key ,--这是课程号  
24.       cname varchar2(50) not null,--课程名  
25.       ccredit number(3) --课程学分  
26.);  
27.  
28.insert into course values(11,'java编程',6);  
29.insert into course values(21,'c++课程',4);  
30.insert into course values(31,'oracle',3);  
31.insert into course values(41,'javaEE',100);  
32.insert into course values(51,'linux',1);  
33.  
34.--建立选课表  
35.create table studCourse  
36.(  
37.       stuCourseId number primary key ,--这是一个自增的,表示一次选课  
38.       sid number  references student(sid),--学生号  
39.       cid number references course(cid),--课程号  
40.       grade number not null--成绩  
41.);  
42.  
43.-- 建立选课序列  
44.create sequence stucourse_seq  
45.start with 1  
46.increment by 1  
47.minvalue 1  
48.nomaxvalue  
49.nocycle  
50.nocache  
51.;  
52.  
53.--初始化数据  
54.insert into studCourse values(stucourse_seq.nextval,20040001,11,90);  
55.insert into studCourse values(stucourse_seq.nextval,20040001,21,19);  
56.insert into studCourse values(stucourse_seq.nextval,20050003,21,45);  
57.insert into studCourse values(stucourse_seq.nextval,20050004,41,99);  
58.insert into studCourse values(stucourse_seq.nextval,20050006,11,39);  



PS:在设计表的时候,应当每张表都有一个主键,且该主键最好不含业务逻辑。


1、查询类的全部属性

基本语法:

    from Domain类名

案例:

    from Student -- 查询Student表中所有数据

 

2、查询类的部分属性

基本语法:

    select 属性1,属性2 from Domain类名

案例:

    select sname,sage from Student

 

3、取出单条记录

基本语法:



[java] view plain copy 
01.session.createQuery(“from xxx where id=123456”).uniqueResult();  


案例:



[java] view plain copy 
01.Student s=(Student) session.createQuery("from Student where sid = 20050003").uniqueResult();  


PS:如果检索一个对象,明确知道最多只有一个对象,则建议使用该方法。


4、过滤重复值

基本语法:

    select distinct 属性1,属性2 from Domain类名

案例:



[java] view plain copy 
01.List list=session.createQuery("select distinct sage,ssex from Student").list();  
02.for(int i=0;i<list.size();i++){  
03.    Object []  objs=(Object[]) list.get(i);  
04.    System.out.println(objs[0].toString()+" "+objs[1].toString());  
05.}  


PS:通过使用distinct可以过滤掉重复的数据。


5、取某个范围类的记录

基本语法:

    [select 属性列表] from Domain类名 where 属性名 between 数值下界 and 数值上界

案例:



[java] view plain copy 
01.List list=session.createQuery("select distinct sage,ssex,sname from Student where sage between 20 and 22").list();  
02.for(int i=0;i<list.size();i++){  
03.    Object []  objs=(Object[]) list.get(i);  
04.    System.out.println(objs[0].toString()+" "+objs[1].toString()+objs[2].toString());  
05.}  



6、存在或不存在与记录里

基本语法:

    [select 属性列表] from Domain类名 where 属性名 in[not in](‘条件1’,’条件2’,’条件3’)

案例:



[java] view plain copy 
01.List<Student> list=session.createQuery("from Student where sdept in ('计算机系','外语系')").list();  
02.//取出  for 增强  
03.for(Student s:list){  
04.    System.out.println(s.getSname()+" "+s.getSaddress()+" "+s.getSdept());  
05.}  



7、模糊查询

基本语法:

    [select 属性列表] from Domain类名 where 属性名 like ‘字符串’

案例:

    from Student where sname like ‘林%’

 

8、group by,having,order by,聚集函数使用

案例1:



[java] view plain copy 
01.//显示各个系的学生的平均年龄  
02.List<Object[]> list=session.createQuery("select avg(sage),sdept from  Student group by sdept").list();  
03.//取出1. for 增强  
04.for(Object[] obj:list){  
05.    System.out.println(obj[0].toString()+" "+obj[1].toString());  
06.}  



案例2:



[java] view plain copy 
01.//1.对分组查询后的结果,进行筛选:比如请显示人数大于3的系名称  
02.//a. 查询各个系分别有多少学生.  
03.List<Object[]> list=session.createQuery("select count(*) as c1,sdept from  Student group by sdept having count(*)>3").list();  
04.//取出1. for 增强  
05.for(Object[] obj:list){  
06.    System.out.println(obj[0].toString()+" "+obj[1].toString());  
07.}  



案例3:



[java] view plain copy 
01.//2查询女生少于200人的系  
02.//a.查询各个系的女生有多个个  
03.List<Object[]> list=session.  
04.createQuery("select count(*) as c1,sdept from Student where ssex='F' group by sdept").list();  
05.//取出1. for 增强  
06.for(Object[] obj:list){  
07.    System.out.println(obj[0].toString()+" "+obj[1].toString());  
08.}  



案例4:



[java] view plain copy 
01.//1.查询计算机系共多少人?->如果我们返回的是一列数据  
02.//这时我们的取法是直接取出list->object 而不是 list->Object[]  
03.List<Object[]> list=session.createQuery("select sage from  Student where sdept='计算机系'").list();  
04.//取出1. for 增强  
05.for(Object obj:list){  
06.    System.out.println(obj.toString());  
07.}  



案例5:



[java] view plain copy 
01.//3.查询选修11号课程的最高分和最低分.  
02.List<Object[]> list=session.  
03.createQuery("select 11,max(grade),min(grade) from Studcourse where course.cid=11").list();  
04.//取出1. for 增强  
05.for(Object[] obj:list){  
06.    System.out.println(obj[0].toString()+" max="+obj[1].toString()+" min="+obj[2].toString());  
07.}  



案例6:



[java] view plain copy 
01.//计算各个科目不及格的学生数量  
02.List<Object[]> list=session.createQuery("select count(*),student.sdept from Studcourse where grade<60 group by student.sdept").list();  
03.//取出1. for 增强  
04.for(Object[] obj:list){  
05.    System.out.println(obj[0].toString()+" "+obj[1].toString());  
06.}  


PS:group by用于分组,having在分组后加限制条件,order by指定排序方式,聚集函数有count(),avg(),max(),min(),sum()五个,大部分内容和SQL中语法相似,给出以前相关内容的博客:Oracle表管理、Java数据库基础


9、实际应用之分页显示



[java] view plain copy 
01.public void showStuByPage(int pageSize,int pageNow){  
02.    Query q = session.createQuery(“from Student”);   
03.    q.setFirstResult((pageNow - 1) * pageSize); //从第几条取  
04.    q.setMaxResult(pageSize);   //取出几条  
05.    List list = q.list();        //执行     
06.    Iterator it=list.iterator();    //显示一下  
07.    while(it.hasnext){  
08.        Student s=(Student)it.next();  
09.        System.out.println(s.getSname());  
10.        System.out.println(s.getSage());  
11.    }   
12.    String hql=“select count(*) from Student”;  
13.    list=session.createQuery(hql).list();  
14.    int pageRow=((Integer)list.get(0)).intValue();  
15.    int pageCount=(pageRow+pageSize-1)/pageSize;//总页数  
16.    }  



10、参数绑定

参数绑定的两种形式:

1、:参数名

基本语法:

    Query q = session.createQuery(from Domain类名 where 属性1=:参数1);

    q.setParameter(“参数1”, ”值1”);

案例:



[java] view plain copy 
01.List<Student> list=session.createQuery("from Student where sdept=:a1 and sage >: sage").setString("a1", "计算机系").setString("sage", "2").list();  


或者可以:



[java] view plain copy 
01.Query q = session.createQuery("from Student where sdept=:a1 and sage >: sage");   
02.q.setString("a1", "计算机系");  
03.q.setString("sage", "2");  



2、“?”形式

基本语法:

    Query q = session.createQuery(from Domain类名 where 属性1=?);

    q.setParameter(“0”, ”值1”);

案例:



[java] view plain copy 
01.List<Student> list = session.createQuery("from Student where sdept=? and sage>?").setString(0, "计算机系").setString(1, "2").list();  


或者是:



[java] view plain copy 
01.   Query query=session.createQuery("from Student where sdept=? and sage>?");  
02.query.setString(0, "计算机系");  
03.query.setString(1, "2");  
04.List <Student> list=query.list();  
05.for(int i=0;i<list.size();i++){  
06.    Student s= list.get(i);  
07.    System.out.println(s.getSname()+" "+s.getSage());  
08.}  



使用参数绑定的好处

1.可读性好.

2.性能提高.

3.防止sql注入.


11、在映射文件中得到HQL语句

案例:

在: Student.hbm.xml 中



[html] view plain copy 
01.<query name="myquerytest">  
02.    <![CDATA[select sname,ssex from Student where sage>22]]>  
03.</query>  


使用方法:



[java] view plain copy 
01.List list=session.getNamedQuery("myquerytest").list();  
02.System.out.println(list.size());  
03.Iterator it=list.iterator();  
04.while(it.hasNext()){  
05.    Object obj[]=(Object[])it.next();  
06.    System.out.println("n="+obj[0]);  
07.}  


PS:通过在映射文件中配置hql,可以使hql的查询更灵活。


12、子查询

案例:显示所有选择了21号课程的学生信息

from Student where sid in (select student.sid from StudCourse where course.cno='21')


13、多表查询

案例:显示林青霞选择的所有课程名和成绩

select s1.sname,s2.course.cid,c1.cname,s2.grade from Student as s1,StudCourse as s2,Course as c1 where s1.sname='林青霞' and s1.sname=s2.student.sname and c1.cid=s2.course.cid

或者

select s1.course.cname,s1.grade from Studcourse s1 where s1.student.sname='林青霞'

 

补充:Criteria的使用

案例:



[java] view plain copy 
01.//查询年龄大于10岁的学生 criteria  
02.Session s=HibernateUtil.getCurrentSession();  
03.Transaction tx=s.beginTransaction();  
04.Criteria cri=s.createCriteria(Student.class);  
05.//添加检索条件  
06.cri.add(Restrictions.gt("sage", new Long(10)));  
07.List<Student> list=cri.list();  
08.for(Student s1: list){  
09.    System.out.println(s1.getSname());  
10.}  
11.tx.commit();         


PS:Criteria的优点是更加面向对象,如果对hql语句不太了解的话可以使用。缺点是: 功能不如hql强大,而且hql是hibernate官方推荐使用的语句。



 

----------参考《韩顺平.hibernate从入门到精通》

 

http://blog.csdn.net/q547550831/article/details/50660239

 

posted @ 2017-07-31 15:25  sky20080101  阅读(106)  评论(0)    收藏  举报