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版权协议,转载请附上原文出处链接和本声明。