ssh学习:hibernate中 HQL基本 查询

虽然我很菜 2016-01-08

hibernate的基本查询

在Hibernate中常用的查询方式会有三种:hql,标准化条件查询,原生派sql

HQL基本查询

HQL:Hibernate uses a powerful query language .  Hibernate uses a powerful query language (HQL) that is similar in appearance to SQL. Compared with SQL, however, HQL is fully object-oriented and understands notions like inheritance, polymorphism and association.(Hibernate使用一个强大的查询语言( HQL ),它在外观上的SQL相似。与SQL相比,但是, HQL是完全面向对象的理解如继承,多态和关联。)

HQL的功能:

条件查询,投影查询,分页查询,分组查询,动态绑定参数查询,内置了函数查询,连接查询,

  • Hibernate的基本查询

       Query接口是Hibernate中专门HQL查询的接口,query接口获取及使用方式

//默认加载hibernate.cfg.xml文件并获取Configuration的数据对象
			Configuration configuration = new Configuration().configure();
			//获取服务对象
			StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
					.applySettings(configuration.getProperties());
			ServiceRegistry build = builder.build();
			//获取SessionFactory从而获取session对象
			SessionFactory sessionFactory = configuration.buildSessionFactory(build);
			//获取session对象
			session = sessionFactory.openSession();
			//打开事务
			transaction = session.beginTransaction();
                        //获取query对象
                        Query query = session.createQuery(hql);
                        // 从query对象中获取数据的集合队列
			 List list = query.list();
//亦可以使用下面的方法代替query.list()方法获取数据对象,但是呢,使用query.list()的方法只执 //行与数据库的一次交互从而获取全部的数据对象的集合对象,而query.iterate()是存在多个返回的数//据对象时候,每一个对象都会执行一次与数据库的交互sql.提倡使用list方法,减少数据库的交互
                         //Iterator students = query.iterate();

    
查询实体对象的全部数据

//hql from
from 表名;(表名为数据持久化对象类的命名名字,必须一致,可以写全路径也可不写全路径,默认会查找全路径 )

   实例:

// hql语句 数据库的表名严格按照数据持久化的命名,可以写全路径,但默认会查找全路径的持久化对象 
			String hql = "from Student";
			// 获取hibernate的转门用于查询的接口query
			Query query = session.createQuery(hql);
			// 获取数据对象的实例,查询的数据自动封装到实体对象当中
			// 在实际的开发当中建议使用query.list()的方法提取数据的全部数据对象实例集合只执行一句sql与数据库进行交互
			List<Student> students = (List<Student>) query.list();
			for (Student stu : students) {
				System.out.println(stu);
			}
			// 在从数据库中提取数据实例时候,若存在多个实例对象,
			// query.iterate()方法会每提取一个数据对象实例时候会执行一次sql与数据库进行交互
			// Iterator students = query.iterate();
			// while (students.hasNext()) {
			// System.out.println(students.next());
			// }
			transaction.commit();

 hql语句也可以换成下面的而形式:使用别名查询

String hql = "select stu from Student As stu ";

 投影查询:即查询数据对象的部分属性/字段

方式一:select 属性1,属性2, from 表名  

这样的投影查询是将查询到的数据对象元素保存在对象数据当中,在将数组保存在一个队列当中。

实例:

// 投影查询
			String hql = "select stu.age ,stu.name from Student As stu";
			Query query = session.createQuery(hql);
			// 一个对象查询到的属性封装在一个数组当中,按照查询的顺序存放
			// 再将每个对象组成的数组保存在队列当中
			List<Object[]> students = query.list();
			for (Object[] student : students) {
				for (Object obj : student) {
					System.out.println(obj);
				}
				System.out.println("+++++++++");
			}

 方式2:实例化投影查询:select new Student(属性1,属性2) from Student

这样的投影查询是将查询的数据元素通过 new 构造方法进行封装到数据对象当中,持久化的类中必须要有相对应的构造方法。这样会比上一种投影查询会好很多!这样是查询到的字段通过构造方法封装到一个对象实例当中,再将一个对象保存到队列中去。

实例:

// 实例化投影查询
			//查询的字段/元素通过相对应的构造方法封装到一个对象 实例当中
			// 必须实现查询字段的构造方法
			String hql = "select new Student(name,age) from Student";
			//获取session对象
			Query query = session.createQuery(hql);
			//将查询得到的数据对象保存在list队列集合当中
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 where 条件查询:

在hql中的where条件查询也可以像sql中一样,使用各种逻辑判定符、比较运算符、范围运算符、模式运算符等。在官方文档中提供的说明:
ssh学习:hibernate中 HQL基本 查询
 实例:

// 条件查询
			// String hql = "select new Student(name,age) from Student where name like 'jing'";
			String hql = "from Student As stu where stu.name like 'jing' ";
			Query query = session.createQuery(hql);
			// 必须实现查询字段的构造方法
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

使用函数库查询:

HQL的附带着强大的函数库:字符串相关,数字相关,集合相关,时间和日期相关


ssh学习:hibernate中 HQL基本 查询
 实例:

//将名字全部转为大写
 String hql = "select new Student(uper(name),age) from Student where name like 'jing'";
			Query query = session.createQuery(hql);
			// 必须实现查询字段的构造方法
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 占位符查询:

方式1:参数位置绑定,使用问号‘?’ 占位  where 字段1=? 字段2=? ;

实例:

// 参数位置占位符
			// 使用问号占位 通过query.set...方法设置相对应的数值,前一参数为第几个问号(0开始)
			String hql = "from Student stu where stu.age=? or stu.name=?";
			Query query = session.createQuery(hql);
			//第一个问号设置参数int为22问号个数从0开始)
			query.setInteger(0, 22);
			//第二个问号设置参数String 为‘gaosi’
			query.setString(1, "gaosi");
			List<Student> students = (List<Student>) query.list();
			for (Student student : students) {
				System.out.println(student);
			}

方式2:参数名字绑定,使用符占位‘:代表符’   。where 字段1=:代表符号1 and 字段2=:代表符号2 ;

实例:

// 占位符
			// 使用参数名字占位符 :代表字符
			String hql = "from Student where name=:name or age=:age";
			Query query = session.createQuery(hql);
			// 向使用age代表的字符赋值22
			query.setInteger("age", 22);
			// 向使用name代表的字符赋值为gaosi
			query.setString("name", "gaosi");
			List<Student> students = query.list();
			for (Student student : students) {
				System.out.println(student);
			}

 distinct查询

String hql = "select distinct age from Student";
			Query query = session.createQuery(hql);
			List<Student> students = query.list();
			System.out.println(students);

 order by查询:对查询的记录进行排序 order  by ... desc /asc. 默认为ASC 升序

实例:

//排序 降序
			String hql = "select age from Student order by age desc";
			Query query = session.createQuery(hql);
			List list = query.list();
  • Hibernate的聚合函数和分组查询

在hql中的聚合函数一般有:
ssh学习:hibernate中 HQL基本 查询
 示例:

// avg函数 求平均值
			String hql = "select avg(stu.age) from Student stu";
			Query query = session.createQuery(hql);
			// 将求得的平均值保存在list中,类型为long型
			List list = query.list();
			System.out.println(list.get(0));
 分组查询: group  by

分组过滤查询:having 。经常与group by 搭配使用

实例代码:

//统计按年龄分组且平均年龄大于22的人数
			 String hql = "select count(stu.age) from Student stu "
			 		+ "group by stu.age having avg(stu.age)>22";
			 Query query = session.createQuery(hql);
			 List list = query.list();
			 System.out.println(list);
 
  • Hibernate的分页查询和批量更新

分页查询:通过query..setFirstResult(bin)设置查询的起始位置,query..setMaxResults(max);设置查询的每页的最大记录条数。实现分页查询

实例代码;

// 分页查询
			 String hql = "select new Student(stu.name,stu.age)"
			 		+ " from Student stu";
			 Query query =	 session.createQuery(hql)
					 //设置查询的起始位置
					 .setFirstResult(3)
					 //设置查询的每页的最大记录条数
					 .setMaxResults(3);
			 List<Student> students = query.list();
			 for (Student student : students) {
			 System.out.println(student);
			
			 }
 批量更新:(批量删除或修改)
int i = query.executeUpdate();// 用于批量处理数据
//当返回的值大于0则是批量处理成功
 实例代码:
String hql = "delete from Student where name=:name";// 批量删除
			// 批量修改
			Query query = session.createQuery(hql);
			// List list = query.list();
			query.setString("name", "zhangsan");
			int i = query.executeUpdate();// 用于批量处理数据
			if (i > 0) {
				System.out.println("成功");
			} else {
				System.out.println("失败");
			}
 
  • Hibernate的命名查询

 在Xxx.hbm.xml文件当中编写hql/sql来实现命名查询  。

编写格式:

<query name="name" >
<![CDATA[   HQL/SQL语句    ]]>
</query>

 示例代码 Xxx.hbm.xml文件编写代码:

<!-- 命名查询 -->
	<query name="selectStudents">
	<![CDATA[from Student]]>
	</query>
//命名查询
                       Query query = session.getNamedQuery("selectStudents");
			List students = query.list();
			System.out.println(students);

更为官方的文档说明以及例子:sql官方文档

相关推荐