使用Hibernate查询数据ppt课件

上传人:鲁** 文档编号:567636592 上传时间:2024-07-21 格式:PPT 页数:28 大小:758.50KB
返回 下载 相关 举报
使用Hibernate查询数据ppt课件_第1页
第1页 / 共28页
使用Hibernate查询数据ppt课件_第2页
第2页 / 共28页
使用Hibernate查询数据ppt课件_第3页
第3页 / 共28页
使用Hibernate查询数据ppt课件_第4页
第4页 / 共28页
使用Hibernate查询数据ppt课件_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《使用Hibernate查询数据ppt课件》由会员分享,可在线阅读,更多相关《使用Hibernate查询数据ppt课件(28页珍藏版)》请在金锄头文库上搜索。

1、第14章 使用Hibernate查询数据1目 录12使用HQL查询数据使用QBC查询数据214.1使用HQL查询数据314.1使用HQL查询数据HQL(Hibernate Query Language)是Hibernate提供的一种面向对象的查询语言,HQL提供了更加丰富灵活的特性,提供了强大的查询能力。在Hibernate中,将HQL作为推荐的查询模式,使用类、对象和属性概念,没有表和字段的概念。HQL提供了更接近传统SQL语句的查询语法。使用传统的JDBC API来查询数据,需要编写复杂的SQL语句,然后还要将查询结果以对象的形式进行封装,放到集合对象中保存。这种查询方式不仅麻烦,而且容易

2、出错。HQL查询与JDBC查询相比,具体以下优点:直接针对实体类和属性进行查询,不要再编写繁琐的SQL语句。查询结果是直接保存在List中的对象,不要再次封装。可以通过配置dialect属性,对不同的数据库自动生成不同的用于执行的SQL语句。414.1.1简单查询从数据表meal中查询所有的产品对象,按照名称升序排序,将查询结果输出到控制台。将项目hibernate-3复制并命名为“hibernate-10”,再导入到 MyEclipse开 发 环 境 中 。 在 测 试 类 HibernateTest中 添 加 testHql_1()方法,并使用Test注解加以修饰。代码如下: String

3、 hql = from Meal as m order by m.mealName asc;HQL语句“from Meal as m”中Meal是类名,而不是表名,因此需要区分大小写,关键字from不区分大小写。在HQL语句中可以使用别名,例如m是Meal类的别名,别名可以使用关键字as指定,as关键字也可以省略。通过order by子句将查询结果按照餐品名称升序排序。升序排序的关键字是asc,降序排序的关键字是desc,查询语句中默认为升序。import org.hibernate.query.Query; Test public void testHql_1() / 编写HQL语句 Str

4、ing hql = from Meal as m order by m.mealName asc; / 创建Query对象 Query query= session.createQuery(hql,Meal.class); / 执行查询,获得结果 List list=query.getResultList() ; / 遍历查找结果 Iterator iterator=list.iterator(); while (iterator.hasNext() Meal meal = iterator.next(); System.out.println(meal.getMealId()+. + mea

5、l .getMealName() + :t + meal .getMealSummarize(); 514.1.2属性查询O简单查询的结果是对象的所有属性,如果只查询对象的部分属性,则称为属性查询,也称为投影查询。在测试类HibernateTest中添加testHql_2()方法,并使用Test注解加以修饰,代码如下: Test public void testHql_1() / 编写HQL语句,使用属性查询 String hql=select m.mealId,m.mealName from Meal as m; / 创建Query对象,此处不使用泛型 Query query= sessio

6、n.createQuery(hql); / 执行查询,获得结果 List list=query.getResultList() ; / 遍历查找结果 Iterator iterator=list.iterator(); while (iterator.hasNext() Object object=(Object)iterator.next(); System.out.println(object0+. +object1); 614.1.3聚集函数在HQL语句中可以使用的聚集函数包括统计记录总数(count)、计算最小值(min)、计算最大值(max)、计算和(sum)、计算平均值(avg)。

7、在实体类Meal.java中有一个属性mealPrice,在映射文件中Meal.hbm.xml中已经为Meal.java中的属性mealPrice配置了映射,对应数据表meal中的MealPrice字段。在测试类HibernateTest中添加testHql_3()方法,并使用Test注解加以修饰,代码如下: / 使用count 统计餐品的记录总数 String hql1=select count(m) from Meal m; Query query1= session.createQuery(hql1); Long count=(Long)query1.uniqueResult(); /

8、使用avg 统计餐品的平均价 String hql2=select avg(m.mealPrice) from Meal m; Query query2= session.createQuery(hql2); Double money=(Double)query2.uniqueResult(); / 使用max 和min 统计最贵和最便宜的餐品 String hql2=select max(m.mealPrice),min(m.mealPrice) from Meal m; Query query3= session.createQuery(hql3); Object price=(Objec

9、t)query3.uniqueResult(); System.out.println(记录总数: +count+ ,平均金额: +money+ ,最低价格为:+price0 +,最高价格为:+price1);714.1.4分组查询在测试类HibernateTest中添加testHql_4()方法,并使用Test注解修饰,以餐品菜系为分组依据对所有餐品进行分组,查询数据表meal中各种类型的餐品总数,代码如下: / 分组统计餐品的菜系总数 String hql=select m.mealseries.seriesName,count(*) from Meal m group by m.meal

10、series; Query query= session.createQuery(hql); List list=query.getResultList() ; / 遍历查找结果 Iterator iterator=list.iterator(); while (iterator.hasNext() Object object=(Object)iterator.next(); System.out.println(“菜系:+ object0 + ,餐品总数:+ object1); 814.1.5动态实例查询在属性查询(或投影查询)时,返回的查询结果是一个对象数组,不易操作。为了提供检索效率,可

11、将检索出来的属性封装到一个实体类对象中,这种方式就是动态实例查询。在测试类HibernateTest中添加testHql_5()方法,并使用Test注解加以修饰,只查询餐品信息中的名称和Id号,将检索出来的属性封装到一个实体类的对象中,代码如下:在HQL语句中使用了Meal类的带餐品Id号和餐品名称两个参数的构造方法,因此需要在实体类Meal类中添加这个构造方法。 /编写Hql语句,使用动态实例查询 String hql = select new Meal(m.mealId,m.mealName) from Meal m; Query query= session.createQuery(hq

12、l,Meal.class); List list=query.getResultList() ; for(Meal m : list) System.out.println(m.getMealId() + . + m.getMealName(); 914.1.6分页查询批量查询数据时,在单个页面上显示所有的查询结果会存在一定的问题,因此需要对查询结果进行分页显示。Query接口提供了用于分页显示查询结果的方法: (1) setFirstResult(int firstResult) (2) setMaxResult(int maxResult)分页查询是系统中常用的一个功能,为了方便调用,先在

13、测 试 类 HibernateTest中 添 加 方 法 pagedSearch(int pageIndex, int pageSize),根据页码和每页显示记录数从数据表meal中获取相应的记录。第一个参数表示当前页码,第二个参数表示每页显示多少个对象。然后在测试类HibernateTest中添加testHql_6()方法,并使用Test注解加以修饰,调用pagedSearch方法。1014.1.7条件查询实际应用中,常常需要根据指定的条件进行查询。此时,可以使用HQL语句提供的where子句进行查询,或者使用like关键字进行模糊查询。根据提供的参数形式,条件查询有两种:按参数位置查询和按

14、参数名字查询。 1按参数位置查询 按参数位置查询时,在HQL语句中需要使用“?”来定义参数的位置。在测试类HibernateTest中添加testHql_7()方法,并使用Test注解加以修饰,按照参数位置查询的方式,查询产品名称包含“鱼”的餐品信息。语句如下: String hql = from Meal m where m.mealName like ?; query.setString(0, “%鱼%”);/不推荐 query.setParameter(0, %鱼%); 1114.1.7条件查询 2按参数名字查询 按参数名字查询时,需要在HQL语句中定义命名参数,且命名参数需要以“:”开

15、头。在测试类HibernateTest中添加testHql_8()方法,并使用Test修饰,按照参数名字查询的方式,查询产品名称包含“鱼”的产品信息。 String hql = from Meal m where m.mealName like :mname; query.setParameter(mname, %鱼%); 在HQL语句中设定查询条件,可使用如表所示各种运算。类型HQL运算符比较运算=、=、2 ; HQL语句中,子查询中引用了外层语句中的别名“ms”,它是Mealseries类的别名。每个菜系包含多个餐品记录,即在meal表中有多条餐品记录对应着mealseries表中的同一条

16、记录,在Mealseries类中创建了Set类型的属性mealSet。 1514.1.9子查询 2无关子查询 无关子查询是指子查询语句与外层查询语句无关。在测试类HibernateTest中添加testHql_12()方法,并使用Test加以修饰,使用无关子查询检索所有低于平均价的餐品对象。 String hql=from Meal m where m.mealPrice15); (2) 使用in关键字的子查询 在测试类HibernateTest中添加testHql_14()方法,并使用Test注解加以修饰,使用in关键字查询数据表meal中包含3条餐品记录的菜系名称。 String hql=

17、from Mealseries ms where 3 in(select count(m) from ms.mealSet as m) ;1714.2使用QBC查询数据1814.2使用QBC查询数据QBC是Qurey By Criteria首字母缩写,Criteria是Hibernate API提供的一个查询接口,位于org.hibernate包下。Criteria查询又称为对象查询,它使用一种封装了基于字符串形式的查询语句的API来查询对象。QBC查询主要由Criteria接口来完成,该接口由Hibernate Session创建,Criterion是Criteria的查询条件。Criter

18、ia提供了add(Criterion criterion)方法来添加查询条件。Criterion接口的主要实现类包括Example、Junction和SimpleExpression。Example主要用来提供QBE(Qurey By Example)检索方式,是QBC的子功能。Criterion接口的实现类一般通过Restrictions工具类来创建。使用工具类Order相关方法设置排序方式,如Order.asc表示升序,Order.desc表示降序。1914.2.1简单查询在使用HQL查询方式时,需要定义基于字符串形式的HQL语句,虽然比JDBC代码有所进步,但仍然繁琐且不方便使用参数查询

19、。Criteria采用面向对象的方式封装查询条件,Criteria API提供了查询对象的另一种方式,提供了Criteria接口、Criterion接口、Expression类,以及Restrictions类作为辅助。从而使得查询代码的编写更加方便。使用Restrictions辅助类,进行Criteria查询的步骤如下: 创建Criteria对象 使用Restrictions对象编写查询条件,并将查询条件加入Criteria对象 执行查询,获得结果在测试类HibernateTest中添加testCriteria_1()方法,使用Test加以修饰,使用Criteria方式从数据表meal中查询所

20、有餐品对象。代码如下: Test public void testCriteria_1() / 创建查询所有餐品的Criteria对象 Criteria c=session.createCriteria(Meal.class); / 对查询结果按 mealName升序排序 c.addOrder(Order.asc(mealName); / 执行查询,获取结果 List list=c.list(); / 循环输出查询结果 for(Meal m : list) System.out.println(m.getMealId() + . + m.getMealName(); 2014.2.2分组查询O

21、根 据 所 属 菜 系 对 餐 品 记 录 进 行 分 组 , 在 测 试 类HibernateTest中添加testCriteria_2()方法,使用Test加以修饰,查询meal表中各个菜系的餐品总记录数及总金额。 / 创建查询所有餐品的Criteria对象 Criteria c=session.createCriteria(Meal.class); / 构建ProjectionList对象 ProjectionList pList=Projections.projectionList(); / 创建分组依据,按菜系进行分组 pList.add(Projections.groupPrope

22、rty(mealseries); / 统计各分组中的记录数 pList.add(Projections.rowCount(); / 统计各分组中的餐品价格总和 pList.add(Projections.sum(mealPrice); c.setProjection(pList); / 为Criteria对象设置Projection List list=c.list();/ 执行查询,获取结果 Iterator iterator=list.iterator(); / 遍历查询结果 while(iterator.hasNext() Object obj=(Object) iterator.nex

23、t(); Mealseries ms=(Mealseries)obj0;System.out.println(菜系名称:+ ms.getSeriesName() + tt餐品记录总数: +obj1+ t价格总和:+ obj2); 2114.2.3聚集函数O在测试类HibernateTest中添加testCriteria_3()方法,并使用Test注解加以修饰,使用内置聚集函数统计meal表中所有餐品价格总和、平均价格、最大价格和最小价格。 / 创建查询所有餐品的Criteria对象 Criteria c=session.createCriteria(Meal.class); / 构建Proje

24、ctionList对象 ProjectionList pList=Projections.projectionList(); / 统计餐品价格总和 pList.add(Projections.sum(mealPrice); / 统计餐品平均价格 pList.add(Projections.avg(mealPrice); / 统计餐品最高价格 pList.add(Projections.max(mealPrice); / 统计餐品最低价格 pList.add(Projections.min(mealPrice); / 为Criteria对象设置Projection c.setProjection

25、(pList); 2214.2.4组合查询O组合查询是指通过Restrictions工具类的相应方法动态构造查询条件,并将查询条件加入Criteria对象,从而实现查询功能。在测试类HibernateTest中编写testCriteria_4()方法,并使用Test注解加以修饰,按餐品名称和餐品价格查询餐品对象。ORestrictions提供了大量的静态方法,来创建查询条件,如表所示。OMatchMode表示匹配模式,包含的静态常量如表所示。 / 封装查询条件 Meal condition=new Meal(); condition.setMealName(虾); condition.setM

26、ealPrice(18.00); / 创建Criteria对象 Criteria c=session.createCriteria(Meal.class); / 使用Restrictions对象编写查询条件,并将查询条件加入到Criteria对象 if (condition!=null) if (condition.getMealName()!=null & !condition.getMealName().equals() / 按餐品名称进行筛选 c.add(Restrictions.like(mealName, condition.getMealName(),MatchMode.ANYWH

27、ERE); if (condition.getMealPrice()Restrictions.ge大于等于 =Restrictions.lt小于 Restrictions.le小于等于 =Restrictions.between对应SQL的BETWEEN子句Restrictions.like对应SQL的LIKE子句Restrictions.in对应SQL的in子句Restrictions.andand关系Restrictions.oror关系Restrictions.sqlRestrictionSQL限定查询匹配模式说明MatchMode.ANYWHERE 模糊匹配MatchMode.EXAC

28、T精确匹配MatchMode.START以某个字符为开头进行匹配MatchMode.END以某个字符为结尾进行匹配2314.2.5关联查询O使用Criteria并通过 Restrictions 工具类,可以实现关联查询。在测试类HibernateTest中编写testCriteria_5()方法,并使用Test注解加以修饰,实现从数据表meal中查询菜系为“川菜”的餐品名称包含“鱼”的产品。 / 创建Criteria对象 Criteria mCriteria=session.createCriteria(Meal.class); / 设置从Meal类中查询的条件 mCriteria.add(R

29、estrictions.like(mealName,鱼, MatchMode.ANYWHERE); / 创建一个新的Criteria实例,以引用mealseries集合中的元素 Criteria msCriteria=mCriteria.createCriteria(mealseries); / 设置从关联的Mealseries类中查询的条件 msCriteria.add(Restrictions.like(seriesName, 川菜); / 执行查询,获取结果 List list=mCriteria.list(); / 循环输出查询结果 for(Meal m : list) System.

30、out.println(餐品名称: + m.getMealName()+ t价格: +m.getMealPrice(); 2414.2.6分页查询O使用Criteria并通过Restrictions 工具类,可以实现分页查询。Hibernate的Criteria也提供了两个用于实现分页的方法:setFirstResult(int firstResult)和setMaxResults(int maxResults)。其中setFirstResult(int firstResult)方法用于指定从哪个对象开始检索,默认为第一个对象(序号为0);setMaxResults(int maxResult

31、s)方法用于指定一次最多检索的对象数,默认为所有对象。O在测试类HibernateTest中添加testCriteria_6()方法,使用Test注解加以修饰。 / 创建Criteria对象 Criteria c=session.createCriteria(Meal.class); / 从第一个对象开始查询 c.setFirstResult(0); / 每次从查询结果中返回4个对象 c.setMaxResults(4); List list=c.list(); / 循环输出查询结果 for(Meal m : list) System.out.println(餐品名称: + m.getMeal

32、Name()+ t价格: +m.getMealPrice(); 2514.2.7QBE查询OQBE是Query By Example的缩写,QBE查询为举例查询,也称示例查询。由于QBE查询检索与指定示例对象具有相同属性值的对象,因此示例对象的创建是QBE查询的关键。示例对象中的所有非空属性都作为查询的条件。O以testCriteria_4()方法中实现的组合查询为例,组合的条件越多,需要的if语句就越多,相当繁琐,此时使用QBE查询最方便。在测试类HibernateTest中编写testCriteria_7()方法,使用Test注解加以修饰,按餐品名称和餐品价格查询餐品对象。 / 封装查询条

33、件 Meal condition=new Meal(); condition.setMealName(虾); condition.setMealPrice(18.00); / 创建Criteria对象 Criteria c=session.createCriteria(Meal.class); /使用Example工具类创建示例,将属性mealPrice排除在示例查询外 Example example= Example.create(condition).excludeProperty(mealPrice); example.ignoreCase(); / 设置不区分大小写 / 设置匹配模式为

34、ANYWHERE example.enableLike(MatchMode.ANYWHERE); / 为Criteria对象指定示例对象example作为查询条件 c.add(example); / 将mealPrice作为一个额外的条件加入查询 if (condition.getMealPrice()0) c.add(Restrictions.le(mealPrice, condition.getMealPrice(); 2614.2.8离线查询OCriteria查询是一种在线查询方式,它是通过Hibernate Session进行创建的。而DetachedCriteria查询是一种离线查询

35、方式,创建查询时无需使用Session,可以在Session范围之外创建一个查询,并且可以使用任意的Session执行它 。 DetachedCriteria提 供 了 两 个 静 态 方 法 :forClass(Class)和forEntityName(Name),可以通过这两个方法创建DetachedCriteria实例。O在测试类HibernateTest中添加testDetachedCriteria()方法,使用Test注解加以修饰,查询餐品名称包含“鱼”的餐品信息。 / 创建离线查询DetachedCriteria实例 DetachedCriteria query=DetachedC

36、riteria.forClass (Meal.class).add(Property.forName(mealName).like(鱼, MatchMode.ANYWHERE); / 执行查询,获取结果 List list= query.getExecutableCriteria(session) .list(); / 循环输出查询结果 for(Meal m : list) System.out.println(餐品名称: + m.getMealName()+ t价格: +m.getMealPrice(); 27总结 本章主要介绍了Hibernate中两个重要的查询:HQL查询和QBC查询。HQL查询时Hibernate提供的一种面向对象的查询方式,其优点在于:直接针对实体类和属性进行查询,不再编写繁琐的SQL语句,查询结果是直接保存在List中的对象,不用再次封装。QBC查询则采用面向对象的方式封装插入查询条件。28

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号