当前位置:
文档之家› 使用Hibernate查询数据
使用Hibernate查询数据
String hql = "from Meal m where m.mealName like :mname"; query.setParameter("mname", "%鱼%");
在HQL语句中设定查询条件,可使用如表所示各种运算。
类型 比较运算 范围运算 HQL运算符 =、<>、>、>=、<、<=、is null、is not null in、not in、between、not between
7
14.1.4 分组查询
在 测 试 类 HibernateTest 中 添 加 testHql_4() 方 法 , 并 使 用 @Test注解修饰,以餐品菜系为分组依据对所有餐品进行分 组,查询数据表meal中各种类型的餐品总数,代码如下:
// 分组统计餐品的菜系总数 String hql="select m.mealseries.seriesName,count(*) from Meal m group by m.mealseries"; Query query= session.createQuery(hql); List list=query.getResultList() ; // 遍历查找结果 Iterator iterator=list.iterator(); while (iterator.hasNext()) { Object[] object=(Object[])iterator.next(); System.out.println(“菜系:"+ object[0] + ",餐品总数 :"+ object[1]);
6
14.1.3 聚集函数
在 HQL 语句中可以使用的聚集函数包括统计记录总数( // 使用 count 统计餐品的记录总数 count )、计算最小值( min)、计算最大值(max)、计算 String hql1="select count(m) from Meal m"; 和( sum)、计算平均值(avg)。 Query query1= session.createQuery(hql1);
逻辑运算
模式匹配
and(逻辑与)、or(逻辑或)、not(逻辑非)
like
12
14.1.8 连接查询
HQL支持各种连接查询,例如:内连接、外连接和交叉连 接等。 1.内连接 内连接是指两个表中指定的关键字相等的值才会出现在查 询结果集中的一种查询方式。在 HQL 中,使用关键字“ inner join”进行内连接。在测试类HibernateTest中添加testHql_9()方 法,并使用@Test加以修饰,从数据表meal中查询菜系为“川 菜”的餐品信息。 String hql = "from Meal as m inner join m.mealseries as ms where ms.seriesName='川菜'"; HQL语句中使用inner join进行内连接,查询返回的结果并 不是 Meal 对象(虽然 from 关键字后面只有 Meal ),而是一个 对 象 数 组 , 对 象 数 组 中 的 第 一 列 是 Meal 对 象 , 第 二 列 是 13 Mealseries对象。
Long count=(Long)query1.uniqueResult(); 在实体类 Meal.java中有一个属性mealPrice,在映射文件中 // 使用avg 统计餐品的平均价 Meal.hbm.xml 中已经为 Meal.java中的属性 mealPrice 配置了 String hql2="select avg(m.mealPrice) from Meal m"; Query session.createQuery(hql2); 映 射 , query2= 对应数据 表 meal 中 的 MealPrice 字 段 。 在 测 试 类 Double money=(Double)query2.uniqueResult(); HibernateTest testHql_3()方法,并使用@Test注解加 // 使用max 和中添加 min 统计最贵和最便宜的餐品 String hql2="select max(m.mealPrice),min(m.mealPrice) 以修饰,代码如下: from Meal m"; Query query3= session.createQuery(hql3); Object[] price=(Object[])query3.uniqueResult(); System.out.println("记录总数:" +count+ ",平均金额:" +money+ ",最低价格为:"+price[0] +",最高价格为:"+price[1]);
直接针对实体类和属性进行查询,不要再编写繁琐的SQL语句。 查询结果是直接保存在List中的对象,不要再次封装。 可以通过配置dialect属性,对不同的数据库自动生成不同的用于 执行的SQL语句。
4
14.1.1 简单查询
import org.hibernate.query.Query; 从数据表 meal中查询所有的产品对象,按照名称升序排序 …… ,将查询结果输出到控制台。 @Test public void testHql_1(){ 将项目 hibernate-3 复制并命名为“hibernate-10”,再导入 // 编写HQL 语句 到 MyEclipse 开发环境中。在测试类 HibernateTest 中添加 String hql = "from Meal as m order by m.mealName asc"; testHql_1() @Test注解加以修饰。代码如下: // 创建方法,并使用 Query对象 Query<Meal> query= session.createQuery(hql,Meal. class); String hql = "from Meal as m order by m.mealName asc"; // 执行查询,获得结果 HQL 语句“from Meal as m”中Meal是类名,而不是表名 List<Meal> list=query.getResultList() ; // 遍历查找结果 ,因此需要区分大小写,关键字 from不区分大小写。 Iterator<Meal> iterator=list.iterator(); 在HQL 语句中可以使用别名,例如 while (iterator.hasNext()) { m 是 Meal 类的别名,别 Meal meal as = iterator.next(); 名可以使用关键字 指定,as关键字也可以省略。 System.out.println(meal.getMealId()+". " + meal 通过order + by" 子句将查询结果按照餐品名称升序排序。升序 .getMealName() :\t" + meal .getMealSummarize()); } 排序的关键字是 asc,降序排序的关键字是desc,查询语句 }
m.getMealName()); } Query<Meal> query= session.createQuery(hql,Meal.class);
在HQL语句中使用了 Meal类的带餐品 Id号和餐品名称两个 参数的构造方法,因此需要在实体类 Meal 类中添加这个构 造方法。
9
14.1.6 分页查询
第14章 使用Hibernate 查询数据
目
1
录
使用HQL查询数据 使用QBC查询数据
2
2
14.1
使用HQL查询数据
3
14.1 使用HQL查询数据
HQL(Hibernate Query Language)是Hibernate提供的一 种面向对象的查询语言, HQL 提供了更加丰富灵活的特性 ,提供了强大的查询能力。在Hibernate中,将HQL作为推 荐的查询模式,使用类、对象和属性概念,没有表和字段 的概念。HQL提供了更接近传统SQL语句的查询语法。 使用传统的JDBC API来查询数据,需要编写复杂的SQL语 句,然后还要将查询结果以对象的形式进行封装,放到集 合对象中保存。这种查询方式不仅麻烦,而且容易出错。 HQL查询与JDBC查询相比,具体以下优点:
然后在测试类 HibernateTest 中添加 testHql_6() 方法,并使 用@Test注解加以修饰,调用pagedSearch方法。 10
14.1.7 条件查询
实际应用中,常常需要根据指定的条件进行查询。此时, 可以使用 HQL 语句提供的 where 子句进行查询,或者使用 like关键字进行模糊查询。 根据提供的参数形式,条件查询有两种:按参数位置查询 和按参数名字查询。 1.按参数位置查询 按参数位置查询时,在HQL语句中需要使用“?”来定义参 数的位置。在测试类HibernateTest中添加testHql_7()方法,并 使用@Test注解加以修饰,按照参数位置查询的方式,查询产 品名称包含“鱼”的餐品信息。语句如下:
中默认为升序。
5
14.1.2 属性查询
简单查询的结果是对象的所有属性,如果只查询对象的部 分属性,则称为属性查询,也称为投影查询。在测试类 @Test HibernateTest中添加testHql_2()方法,并使用@Test注解加 public void testHql_1(){ 以修饰,代码如下: // 编写HQL语句,使用属性查询