hibernate查询语言HQL的使用

概念

简介

hibernate查询语言(Hibernate Query Language),适用于所有数据库,可以转换成不同数据库的sql语句,是Hibernate官方推荐使用的查询语句。

思想

面对对象的方式生成SQL语句,查找数据库。

查询

语法:
必须封装到Query对象中才能使用

简单例子
查询用户名以“a”开头的所有用户。

Query query=session.createQuery("from User user where user.name like 'a%'");
List userList=query.list();

复杂例子
从User和Group中查找属于“zte”组的所有哦用户。

Query query = session.createQuery("from User user where user.group.name='zte'");
List userList = query.list();

如果使用传统的SQL语句:

select user.userId as userId, user.name as name, user.groupId as groupId, user.idCardId as idCardId  from TBL_USER user, TBL_GROUP group where (group.groupName=‘zte'  and user.groupId=group.Id)

属性查询

单一属性查询

代码示例:

public void testQuery1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//返回结果集属性列表,元素类型和实体类中相应的属性类型一致
			List students = session.createQuery("select name from Student").list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}

多属性查询

代码示例:

public void testQuery2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			//查询多个属性,其集合元素是对象数组
			//数组元素的类型和对应的属性在实体类中的类型一致
			//数组的长度取决与select中属性的个数
			List students = session.createQuery("select id, name from Student").list();
			for (Iterator iter=students.iterator(); iter.hasNext();) {
				Object[] obj = (Object[])iter.next();
				System.out.println(obj[0] + "," + obj[1]);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}

数据存储:

  • Hibernate会为每一个对象创建一个Object数组对象
  • 将对象中的属性的值分别设到数组对象的元素中;
  • list中存放着每个数组对象的地址

使用别名

将s作为Student对象的别名:

List students = session.createQuery("select s.id, s.name from Student s").list();

可以使用as命名别名:

List students = session.createQuery("select s.id, s.name from Student as s").list();

根据传入参数进行条件查询

查询一种参数

查询name属性中包含1的对象:

使用?方式传递参数:

//			Query query = session.createQuery("select s.id, s.name from Student s where s.name like ?");
//			query.setParameter(0, "%1%");
//			List students = query.list();
			
			//可以使用?方式传递参数
			//参数的索引从0开始
			//传递的参数值,不用单引号引起来
			//注意方法链编程
			List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")
			       					.setParameter(0, "%1%")
			       					.list();

使用参数名称的方式传递参数:

//          使用 :参数名称 的方式传递参数值
			List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
			       					.setParameter("myname", "%1%")
			       					.list();

查询某个时间段:2020年2月创建的学生:

在hql中可以使用数据库函数,如date_format

            //查询2020年2月创建的学生
			//使用MySQL数据函数date_format
			//将和对应填充符格式一致的字符串自动转换成日期型
			//将转换的日期作为查询条件
			List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
									.setParameter(0, "2020-02")
			       					.list();

查询某个时间范围内:2020年2月创建的学生:

            //查询2010-01-10到2010-02-15创建的学生
			List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
									.setParameter(0, sdf.parse("2010-01-10 00:00:00"))
									.setParameter(1, sdf.parse("2010-02-15 23:59:59"))
			       					.list();

查询多种参数

查询name属性中包含1,且id为12的对象:

//          使用 :参数名称 的方式传递参数值
//          通过多个条件查询记录
			List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname and s.id=:myid")
			       					.setParameter("myname", "%1%")
			       					.setParameter("myid", 12)
			       					.list();

对同一类型的多个参数进行查询

查询所有id为1,2,3,4,5的对象:

//          支持in,需要使用setParameterList进行参数传递
//          查找多条指定id的记录
			List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
									.setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
			       					.list();

直接使用sql进行查询

Hibernate中支持使用原生sql语句

查询t_student表中的所有记录:

List students = session.createSQLQuery("select * from t_student").list();

分页查询

从第0条记录开始查询,每页2条记录:

            //从第0条记录开始查询,每页记录数最多为2
			List students = session.createQuery("from Student")
									.setFirstResult(0)
									.setMaxResults(2)
									.list();

若传递过来的是页号,则转换为记录setFirstResult((pageNo - 1) * pageSize)

PS:pageNo为页号,pageSize为每页最大记录数。

对象导航查询

通过Student表的外键查找Class表中的含有1的name字段记录:

//从Student类对应的表中的关联属性中,查询所指的Class对象的name属性,
List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();

相当于SQL的内连接

连接查询

内连

查询Student的name及其所对应的Class的name:

//将Student类对应的表和Class类对应的表通过主外键做内连
List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();

左外连

//将Class对应的表和Stuent对应的表通过关联属性进行左外连
List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();

右外连

//右外连
List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();

统计查询

查询对象的个数

查询有多少个学生:

            //查询Student对象的个数,不是记录的个数
			Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
			System.out.println(count);

分组查询

查询每个班级有多少个学生:

            //将两张表自然连接,进行统计查询
			List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
					"group by c.name order by c.name").list();

说明:本文仅用作学习笔记,无其他用途,如有冒犯可联系本人删除


版权声明:本文为m0_50489432原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。