数据查询方式_第1页
数据查询方式_第2页
数据查询方式_第3页
数据查询方式_第4页
数据查询方式_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据查询方式回顾HQL查询方式QBC查询方式(Query

By

Criteria)原生SQL方式导入新课HQL查询方式QBC查询方式原生SQL方式·

难点:·

HQL,QBC8.3

数据查询方式Hibernate提供的面向对象查询方式,通过正确配置关联关系,指定查询条件,就可以轻松得到数据,避免冗长的SQL代码。Hibernate支持的数据查询方式包括:HQLQBC原生SQL返回8.3.1

数据查询方式—HQL(1)HQL(HibernateQueryLanguage)语法结构和SQL相似,其功能如下:支持条件查询。支持连接查询。支持分页查询。支持分组查询(having和group

by)。支持内置函数和自定义函数查询(sum()、min()、max())。支持子查询,即嵌入式查询。支持动态绑定参数查询。8.3.1

数据查询方式—HQL(2)Session类的find()方法以及Query接口都支持HQL检索方

式。区别在于:前者只是执行一些简单HQL查询语句的便

捷方法,不具有动态绑定参数的功能,而且在

Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查

询功能。HQL查询完全面向对象的查询例如:u.firstname

=

?");Query

q

=

session.createQuery(“from

User

u

whereq.setString(0,

"Max");List

result

=

q.list();u.firstname

=

:fname"Query

q

=

session.createQuery("from

User

u

whereq.setString("fname",

"Max");List

result

=

q.list();属性查询Query

q

=

session.createQuery(“select

u.username

from

User

uQuery

query

=

session.createQuery("select

,

s.age

from

StudeList

list

=

query.list();

for(int

i=0;i<list.size();i++){Object

obj[]=(Object[])list.get(i);System.out.println(obj[0]+"的岁数为:"+obj[1]);}实例化查询Query

query

=

session.createQuery("select

new

Student(,

s.agStudent

as

s");List

list

=

query.list();for(int

i=0;i<list.size();i++){Student

stu=(Student)

list.get(i);}要定义对应的构造函数连接查询Object

obj[]=null;Team

team

=

null;for(int

i=0;i<list.size();i++){obj=

(Object[])

list.get(i);stu=(Student)

obj[1];team=(Team)

obj[0];//team

=

(Team)list.get(i);System.out.println(stu.getName()+"属于:"+team.getTeamName(}//提交事务,关闭会话System.out.println(team.getStudents.size());使用join

fetch连接,将会对学生预先抓取session=HibernateUtil.currentSession();//开启连j接oin

fetchtx=session.beginTransaction();//开启事务Query

query

=

session.createQuery(“

from

Team

t

join

t.studentsList

list=query.list();统计函数(Aggregate

functions)返回属性的统计函数的结果select

avg(cat.weight)

from

eg.Cat

catselect

sum(cat.weight)

from

eg.Cat

catselect

max(cat.weight)

from

eg.Cat

catselect

count(cat)

from

eg.Cat

catselect

upper()

from

eg.Cat

catselect

distinct

from

eg.Cat

cat多态(polymorphism)查询下列查询会返回所有的持久化对象报销单请假单采购单from

java.lang.Object

o实际应用:在一个列表页面列出所有申请单from

BusinessDocument

o业务单据子查询对于支持子查询的数据库来说,Hibernate支持在查询中嵌套子查询from

Student

stuwhere

stu.age

>(select

avg(s.age)from

Student

s)8.3.2

数据查询方式—QBCQBC(QueryByCriteria)使用Hibernate的CriteriaAPI进行数据检索方式,通过Session类创建Criteria实例,并调用该实例的不同方法进行数据检索。采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC

API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。通过将条件加入到Criteria实例中Criteria实例是一个查询条件的容器Criteria查询是更符合面向对象的编程方式QBC查询(Query

By

Criteria)·

查询所有学生Criteria

criteria

=

session.createCriteria(Student.class);List

students

=

criteria.list();·

查询年龄位于18-20之间,姓’Zhang’的学生List

students=null;Criteria

crit

=

session.createCriteria(Student.class)

;crit.add(Restrictions.like(“stuName",

“Zhang%")

)

;crit.add(Restrictions.between(“age",

18,

20)

);students

=

crit.list();连接设定HQL中预先抓取from

Team

t

left

join

fetch

t.students

swhere

t.teamName

like

‘%2’Criteria查询设置预先抓取,与上面等效List

list

=

Session.createCriteria(Team.class).setFetchMode(“students”,

FetchMode.JOIN).add(Restriction.like(“teamName”,”2”,MatchMode.END)).list();HQL查询总是忽略配置文件中的预先抓取FetchMode.JOIN

预先抓取FetchMode.SELECT

延迟加载FetchMode.DEFAULT

使用配置中的加载策略QBC统计·

在QBC中可以用Projections实现统计,Projections有以下的方法:avg()rowCount()count()max()min()countDistinct()QBC统计//统计员工数量Criteria

crit

=

session.createCriteria(EmployeeVO.class);//countDistinct()去重复crit.setProjection(Projections.count("oid"));List

emps=crit.list();//求年龄最大的员工Criteria

crit

=

session.createCriteria(EmployeeVO.class);crit.setProjection(Projections.max(“age"));List

emps

=

crit.list();QBC去重复根元素Criteria

crit=session.createCriteria(EmployeeVO.class);crit.setFetchMode("department",FetchMode.JOIN);crit.setResultTransformer(crit.DISTINCT_ROOT_ENTITY);//去重复List

emps=crit.list();for

(Iterator

iter

=

emps.iterator();

iter.hasNext();)

{EmployeeVO

emp=(EmployeeVO)iter.next();System.out.println("员工名称:"+emp.getEmpName()+"部门:"+emp.getDepartment().getDeptName());}数据查询方式—QBCQBC查询方式的实现步骤://创建一个Criteria对象Criteriacriteria=session.createCriteria(Customer.class);//设定查询条件,然后把查询条件加入到Criteria中Criterioncriterion1=Expression.like("name","T%");Criterioncriterion2=Expression.eq("age",newInteger(21));criteria.add(criterion1);criteria.add(criterion2);//执行查询语句,返回查询结果

Listresult=criteria.list();8.3.2

数据查询方式—QBC(3)调用Session的createCriteria()方法创建一个Criteria对象。设定查询条件。Expression类提供了一系列用于设定查询条件的静

态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方法用于加入查询条件。调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法时,Hibernate执行的SQL查询语句为:select*fromCUSTOMERSwhereNAMElike"T%"andAGE=21;返回使用QBC方式查询部分字段和使用聚集函数代码示例:ProjectionList

proList

=

Projections.projectionList();proList.add(Projections.groupProperty("empno"));

proList.add(Projections.groupProperty("ename"));

proList.add(Projections.sum("sal"));

criteria.setProjection(proList);

criteria.add(Restrictions.eq("deptNo",

20));List<Object>

list

=

criteria.list();for

(Object

obj:

list)

{Object[]

objArray

=

(Object[])obj;System.out.println("empno

=

"

+

objArray[0]

+

",ename="

+

objArray[1]",salavg="

+

objArray[2]);}使用QBC方式查询部分字段和使用聚集函数·

生成的SQL语句如下Selectthis_.EMPNO

as

y0_,

this_.ENAME

as

y1_,sum(this_.SAL)

as

y2_fromemp

this_wherethis_.DEPT_NO=?group

bythis_.EMPNO,

this_.ENAME使用ProjectionList

可以将多个查询组件合并在一个list里面,然后一次性的放入到criteria中。查询部分字段,其实就是变向的使用Projections.groupProperty8.3.3

数据查询方式—原生SQL(1)采用HQL或QBC检索方式时,Hibernate会生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。有的应用程序可能需要根据底层数据库的SQL方言,来生成一些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论