hibernate 中HQL语句查询学习笔记一

 

6.1.7 删除对象

HQL语句可以直接对复合条件的对象进行删除,可以指定删除的对象,并在提交后永久持久化到数据库。HQL使用delete进行删除,如删除年龄大于25岁的学生可以使用如下代码。

        Session session=HibernateSessionFactory.currentSession();                                //创建Session

        Transaction tx=null;                                                       //声明事务

        

        try{

               tx=session.beginTransaction();                                      //开始事务

           

              //创建查询

               String hql="delete Student s where s.sage>25";

               Query query=session.createQuery(hql);

               query.executeUpdate();                                               //执行

             tx.commit();                                                           //成功,则提交

               tx=null;

        }catch(Exception e){

               e.printStackTrace();

               if(tx!=null){

              tx.rollback();                                                                            //失败则回滚

       

    }

        }finally{

               session.close();

        }

注意以下两点。

*     在删除对象时,执行query.executeUpdate()进行数据删除,但只有执行了tx.commit()进行事务提交时,才真正从数据库中删除数据。

*     如果设置了级联删除,则与之相关联的对象实例也被删除。

6.1.8 更新对象值

更新对象的HQL语句与SQL语法很相似,使用update更新对象的值。如下面例子更新对象的sage属性。

        ransaction tx=null;                                                         //声明事务

        try{

               tx=session.beginTransaction();                                      //开始事务

           

               String hql="update Student s set s.sage='22' where s.id=11";               //更新语句

               Query query=session.createQuery(hql);

               query.executeUpdate();                                               //执行

               tx.commit();                                                           //成功,则提交

               tx=null;

        }catch(Exception e){

               e.printStackTrace();

               if(tx!=null){

                       tx.rollback();                                                 //失败则回滚

               }

        }finally{

               session.close();

        }

6.1.9 查询计算属性值

HQL可以查询经过计算的值,在一些需要计算的地方可以进行计算,例如查询全体学生的姓名和出生年份。

select s.sname,2006-s.sage from Student as s

*     select子句十分灵活,几乎和SQL语句有着同样的能力,对象的属性值可以参与运算。

*     这行代码假设当前的年份是2006年。

下面是另外几个查询计算属性值的例子。

select s.sname,2006-s.sage from Student as s

6.1.10 使用函数

当需要调用函数时,HQL提供了一些类似SQL的函数。这些函数可以简化操作。例如查询学生的姓名、出生日期和性别,其中性别用小写表示。

select s.sname,2006-s.sage,lower(s.ssex) from Student as sselect s.sname,2006-s. sage from Student as s

6.1.11 between...and...和not between... and...确定查询范围

between...and...用来查询属性值在指定范围内的实体对象,not between...and...用来查询属性值不在指定范围内的实体对象。如查询学生年龄在22到23之间的学生:

select s.sno,s.sname,s.sage from Student s where s.sage between 22 and 23

查询将返回如下结果。

---------------------------------------------------------------------

1    20040001 李晓梅    22    计算机系   

---------------------------------------------------------------------

2    20040002 王蒙       23    外语系   

---------------------------------------------------------------------

4    20050004 李文       22    计算机系   

between后跟的是查询范围的下限,and后跟的是查询范围的上限,所以下面的查询语句总没有对象返回。

from Student s where s.sage between 23 and 22

6.1.12 in和not in确定查询集合

关键字in用来查询指定属性值属于指定集合的对象,关键字not in用来查询指定属性值不属于指定集合的对象。如查询不是计算机系,也不是数学系的学生。

select s.sno,s.sname,s.sdept from Student s where s.sdept not in ('计算机系','数学系')

查询将返回如下结果。

---------------------------------------------------------------------

20040002         王蒙         外语系   

---------------------------------------------------------------------

20050003         姜浩         化学系   

---------------------------------------------------------------------

20050005         薛鹏         生物系   

6.1.13 like进行模糊查询

用like进行模糊查询时有两个可用的通配符:“%”和“_”。“%”代表长度大于等于0的字符,“_”代表长度为1的单个字符。

查询姓李的学生:

select s.sno,s.sname,s.sdept from Student s where s.sname like '%李%'

查询结果如下。

---------------------------------------------------------------------

20040001         李晓梅    计算机系   

---------------------------------------------------------------------

20050004         李文       计算机系   

---------------------------------------------------------------------

20050006         李思       数学系   

查询姓名为两个字符的学生:

select s.sno,s.sname,s.sdept from Student s where s.sname like '__'

查询结果如下。

---------------------------------------------------------------------

20040002    王蒙    外语系   

---------------------------------------------------------------------

20050003    姜浩    化学系   

---------------------------------------------------------------------

20050004    李文    计算机系   

---------------------------------------------------------------------

20050005    薛鹏    生物系   

---------------------------------------------------------------------

20050006    李思    数学系   

6.1.14 and逻辑与

当要检索指定的多个条件,且条件的逻辑关系为与时,使用“and”关键字。如检索计算机系的女生,这个检索要求包含两个条件:“计算机系”和“女生”。

select s.sno,s.sname,s.sdept from Student s where s.sdept='计算机系' and s.ssex='F'

检索的结果如下。

---------------------------------------------------------------------

20040001         李晓梅    计算机系   

---------------------------------------------------------------------

20050004         李文      计算机系   

6.1.15 or逻辑或

当检索的多个条件,且条件的逻辑关系为或时,使用“or”关键字。如检索姓王,或者年龄大于22岁的学生:

select s.sno,s.sname,s.sdept from Student s where s.sname like '王%' or s.sage>22

检索结果如下。

---------------------------------------------------------------------

20040002         王蒙         外语系   

---------------------------------------------------------------------

20050005         薛鹏         生物系

6.1.16 order by对结果进行排序

“order by”关键字对结果进行排序,默认为升序。“order by asc”为升序,“order by desc”为降序。例如将学生表中的学生按照年龄升序排序:

from Student s order by s.sage

检索结果如下。

---------------------------------------------------------------------

6    20050006         李思         20         数学系   

---------------------------------------------------------------------

3    20050003         姜浩         21         化学系   

---------------------------------------------------------------------

1    20040001         李晓梅      22        计算机系   

---------------------------------------------------------------------

4    20050004         李文         22         计算机系   

---------------------------------------------------------------------

2    20040002         王蒙         23         外语系   

---------------------------------------------------------------------

5    20050005         薛鹏         24         生物系   

将学生表中的学生按照年龄降序排列,按照所在系升序排列。

from Student s order by s.sage,s.sdept desc

6.1.17 group by对记录进行分组

对查询进行分组可以对查询进行细化。分组经常和聚集函数一起使用,这样聚集函数将作用于每个分组。

*     group by的用法为:

select 属性1,属性2,属性3 ,…,属性n from 类名 group by 属性m

*     其中属性1,属性2,…,属性n必须满足下列条件。

要么作为聚集函数的参数,要么为属性m。例如,检索各个系的学生的平均年龄:

select avg(s.sage),s.sdept from Student s group by s.sdept

其中字段s.sage作为平均值函数的参数,s.sdept是group by后的一个属性。检索的结果如下。

---------------------------------------------------------------------

化学系         21.0   

---------------------------------------------------------------------

计算机系       22.0   

---------------------------------------------------------------------

生物系         24.0   

---------------------------------------------------------------------

数学系         20.0   

---------------------------------------------------------------------

外语系         23.0   

检索各个课程号与对应的选课人数。

select cno,count(sno) from SC s group by s.cno

6.1.18 having关键字

having关键字和group by关键字搭配使用,它对分组后的记录进行筛选,输出符合having指定条件的组。例如查询人数超过1000人的系。

select s.sdept from Student s group by s.sdept having count(*)>1000

查询男生人数多于500人的系。

select s.sdept from Student s where s.ssex=’M’ group by s.sdept having count(*)>500

*     以上面查询男生人数多于500人的系为例:

select s.sdept from Student s where s.ssex=’M’ group by s.sdept having count(*)>500

查询过程中同时使用group by和having关键字时,查询步骤如下。

(1)检索符合s.ssex=‘M’的所有男生。

(2)根据s.sdept分组成不同的系。

(3)对于每一个分组,计算分组中的记录条数大于500的系。

(4)将符合上述条件的s.sdept选出来。

*     where和having的区别在于作用对象不同。where作用于基本表,而having作用于分组后的组。

6.1.19 聚集函数

聚集函数包括count()、avg()、sum()、max()、min(),其含义如表6-1所示。

表6-1                                                         聚集函数及其含义

聚 集 函 数

含    义

count()

计算符合条件的记录条数

avg()

计算符合条件的平均值

sum()

计算符合条件的和

max()

计算符合条件的最大值

min()

计算符合条件的最小值

*     各个函数的用法举例如下。

检索学生实例的对象个数:

select count(*) from Student

检索计算机系的人数:

select count(*) from Student s where s.sdept='计算机系'

检索学生实例的平均年龄:

select avg(s.sage) from Student s

检索课程表course的所有课程的学分的总和:

select sum(c.ccredit) from Course c

检索课程号为“1”的课程的最高成绩:

select max(s.grade) from SC s where s.cno=1

检索课程号为“1”的课程的最低成绩:

select min(s.grade) from SC s where s.cno=1

*     聚集函数经常和group by分组关键字搭配使用。

检索各门课程的平均成绩:

select s.cno,avg(s.grade) from SC s group by s.cno

检索各科不及格人数:

select s.cno,count(*) from SC s where s.grade<60 group by s.cno

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值