使用hql查询数据
hibernate提供的查询方式:
1、oid查询方式
通过session提供的get()和load()方法加载指定的oid对象,只能按照对象的id进行查询。
2、hql查询方式
通过query接口使用hql语言进行查询。
3、qbc查询方式
通过criteria等接口和类进行查询
4、本地sql查询方式
使用原生sql语言进行查询,查询结果不是结果集,而是持久化类对象。
5、对象导航查询方式
通过已经加载的对象,导航到其关联对象。
hql是hibernate提供的面向对象的查询语言,hql和sql的语法格式相似,hql操作持久化类,而不是数据库表。
使用hql查询步骤:
1、得到session对象。
session session =hibernateutil.getsessionfactory().opensession();
2、编写hql语句。
string hql =from student where sname='tom';
3、创建query对象。
query query = session.createquery(hql);
4、执行查询,得到结果。
listlist = query.list();
注意:hql操作的是持久化类,因此上述第二步中student指的是持久化类student,sname指的是持久化类属性sname,而不是数据库表的字段sname。
query接口,是hql查询接口,提供了各种的查询功能,相当于jdbc的statement和preparedstatement。可以通过session的createquery()创建其对象。
实体查询
就是要查询持久化类的完整信息,要查询它的全部属性
例如:
from student或者from com.po.student通常不需要使用类的全限定名缺省时自动引入。from student s或from student as s,这是为类名取别名,其中as是可选的。where子句。from student where sid=11070130或者fromstudent s where s.sid=11070130
where子句中可以使用各种运算符
例如:
from student where sex=’男’ and sid20
分页查询使用hibernate query接口提供的方法。
1、setfirstresult()设置第一条记录的位置。
2、setmaxresult()设置最大返回的记录条数。
分页实现:
1、根据结果获得总记录数
query query =session.createquery(“from student”); listlist = query.list(); int count =list.size();
2、计算总的页数 inttotalpages = (count%pagesize==0)?(count/pagesize):(count/pagesize+1);
3、实现分页 query.setfirstresult((pageindex-1)*pagesize); query.setmaxresults(pagesize); list result =query.list();
子查询示例:查询成绩高于张华和赵飞成绩的学生信息
from student where score >all(select score fromstudent where sname=’张华’ or sname=’赵飞’);
all的含义是分数要高于括号内所有的分数,如果题目要求查询高于张华或赵飞的成绩,应该使用any关键字。连接查询
使用join子句实现多个持久化对象之间的联合查询。一般是针对连个持久化对象进行查询。
查询分类
示例,用到的数据库表为班级表和学生表,表情况如下:
内连接语法:
from entity inner join entity.property
entity指明了一个持久化类,entity.propery是指明了第一个持久化类中与第二个持久化类建立关联的属性
例如:查询班级和学生中的所有匹配数据。
from grade g inner join g.students等价于以下两个语句:from grade g,student s whereg=s.grade
from grade g,student s where g.gid=s.grade.gid;
左外连接语法
from entity left outer join entity.property
例如,显示班级和学生中的匹配信息,并且显示没有学生的班级
from grade g left join g.students;
右外连接语法:
from entity right outer join entity.property
例如,显示班级和学生中的匹配信息,并且显示没有班级的学生信息
from grade g right join g.students;或者
from student s left join s.grade;