实体查询
示例:
from cn.jbit.hibernatdemo.entity.Dept
select dept from Dept as dept
from Dept where deptName = 'SALES'
from Dept dept where dept.location is not null
from Emp order by hireDate,salary desc
- 条件
投影查询
指定属性查询
通过构造方法
实体查询的更新和删除
示例:
//更新
String hql = "update Emp set ename = 'XX' where empno = 'XX'";
//删除
String hql = "delete from Emp where empno = 'XX'";
//创建Query接口实例,预编译hql语句
Query query = session.createQuery(hql);
//执行hql语句,返回影响条数
int count = query.executeUpdate();
参数绑定
- 使用?占位符
示例:
String hql = "from Emp where ename =?";
Query query = session.createQuery(hql);
query.setString(0, "张三");//参数下标从0开始
- 使用命名参数
String hql = "from Emp where ename =:param";
Query query = session.createQuery(hql);
query.setString("param", "张三");
//query.setParameter("param", "张三");
//推荐使用这一种,不依赖参数出现顺序,使用灵活
排序、统计函数、分组
- 排序
hql语句示例:
1.通过order by子句实现对查询结果排序,默认升序
String hql = "from Emp order by empno";
2.指定排序方式:asc(升序)、desc(降序)
String hql = "from Emp order by empno desc";
3.多个排序条件
String hql = "from Emp order by empno,ename desc";
- 统计函数
1).avg() 平均数
2).sum()求和
3).min()最小值
4).max()最大值
5).count()统计次数
示例:
String hql = "select count(*) from Emp";
long count = (Long)session.createQuery(hql).uniqueResult();
//uniqueResult()获取唯一对象,返回值是Long类型
- 分组
示例:
//统计人数大于20的班级的学生人数
String hql = "select gid,count(*) from Student
group by gid
having count(*)>20";
分页
- Hibernate Query接口提供的方法
1).setFirstResult()设置第一条记录的位置
2).setMaxResults()设置最大返回的记录条数
//每页显示2条数据,显示第二页数据
public static void query() {
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
String hql = "from Student";
Query query = session.createQuery(hql);
//从第几条开始,HQL是从0开始 SQL是从1开始
query.setFirstResult(0);
//显示条数
query.setMaxResults(2);
List<Student> list = query.list();
for(Student s : list) {
System.out.println(s.getSname());
}
}
子查询、连接查询
- 子查询
//查询成绩高于A和B的学生信息
String hql = "from Student where score > all
(select score from Student where
sname = 'A' or sname = 'B')";
连接查询
示例
1).使用迫切左外连接查询所有学习Java的学生信息
2).使用左外连接查询所有学习Java的学生信息
- 为什么没有右外迫切连接?
随手画了一张图解释
批处理
- hibernate.cfg.xml添加批处理配置
//批处理数一般设置为10~50
<property name="hibernate.jdbc.batch_size">20</property>
//关闭二级缓存
<property name="hibernate.cache.use_second_level_cache">false</property>
- 示例
/**
* 批量插入数据
*/
public void method1() {
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
Dept dept = null;
for(int i = 1; i < 1000; i++) {
dept = new Dept();
dept.setDname(i + "");
dept.setLoc(i + "i");
session.save(dept);
//批量操作数设置为与配置文件一致
if(i % 20 == 0) {
session.flush();
session.clear();
}
}
transaction.commit();
HibernateSessionFactory.closeSession();
}
/**
* 批量更新数据
*/
public void method2() {
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
String hql = "from Dept";
//游标,设置batch_size属性为20且关闭二级缓存
ScrollableResults results = session.createQuery(hql).scroll(ScrollMode.FORWARD_ONLY);
while (results.next()) {
Dept dept = (Dept) results.get(0);
dept.setDname("Java");
}
transaction.commit();
HibernateSessionFactory.closeSession();
}