- 注:这是笔者在学习时的小小记录,只是为了对自己的知识查缺补漏,有可能有些地方写错,仅供参考
QBC查询
在Hibernate中为我们提供了两种方式的查询,一种是HQL查询,HQL查询需要我们自己编写类似于SQL语句的HQL,而QBC语句一般情况下是不需要写任何语句,可以依靠API来进行各种查询操作。
- 全查操作
/**
* 全查操作
*/
@Test
public void test1() {
//获取session对象,通过自定义工具类获取,具体步骤见笔记一
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
/*
* QBC查询与HQL查询的区别:
* 在HQL查询中,我们需要使用到类似于SQL语句的HQL语句,大部分查询都得通过编写HQL语句来实现
* 在QBC查询中,不需要编写SQL语句或者HQL语句,在QBC中的查询是依靠API来查询,查询方式更加面向对象
*/
//全查的方式,使用session.createCriteria(持久化类的Class对象)获得Criteria对象
//类似指定要查询哪一张表
Criteria criteria = session.createCriteria(User.class);
//通过criteria.list()得到数据集合
List<User> list = criteria.list();
//遍历输出每一条数据
for (User user : list) {
System.out.println(user);
}
//提交事务
transaction.commit();
//关闭资源
session.close();
}
- 条件查询
/*
* 条件查询
*/
@Test
public void test2() {
//获取session对象,通过自定义工具类获取,具体步骤见笔记一
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//类似指定要查询哪一张表
Criteria criteria = session.createCriteria(User.class);
/*
* criteria.add(Criterion criterion)
* Criterion的官方解释:
* 一种查询条件的面向对象表示法,可在条件查询中用作限制。内置条件类型由限制工厂类提供。
* 这个接口可以由定义自定义限制条件的应用程序类实现。
* 简单来说,这个类就是用来定义我们的查询条件的,可以通过Restrictions这个条件工厂来创建不同的条件
* Restrictions可以创建的条件有:eq:等于;gt:大于;ge:大于等于;lt:小于le:小于等于;ne:不等于;
* in:包含在某个集合中;like:包含某个子字符串
* and:将多个条件与运算;or:将多个条件或运算,例:Restrictions.add(like("uname", "小%")).add(eq("age", "18").)
*/
//查询uname以小开头的数据,使用like,其他方法类似
criteria.add(Restrictions.like("uname", "小%"));
//通过criteria.list()得到数据集合
List<User> list = criteria.list();
//遍历输出每一条数据
for (User user : list) {
System.out.println(user);
}
//提交事务
transaction.commit();
//关闭资源
session.close();
}
- 分页查询
/**
* 分页查询
*/
@Test
public void test3() {
//获取session对象,通过自定义工具类获取,具体步骤见笔记一
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//类似指定要查询哪一张表
Criteria criteria = session.createCriteria(User.class);
//设置从0行开始查询
criteria.setFirstResult(0);
//设置每页查询2条数据
criteria.setMaxResults(2);
//通过criteria.list()得到数据集合
List<User> list = criteria.list();
//遍历输出每一条数据
for (User user : list) {
System.out.println(user);
}
//提交事务
transaction.commit();
//关闭资源
session.close();
}
- 排序查询
/**
* 排序查询
*/
@Test
public void test4() {
//获取session对象,通过自定义工具类获取,具体步骤见笔记一
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//类似指定要查询哪一张表
Criteria criteria = session.createCriteria(User.class);
//排序查询使用addOrder(Order.desc或者Order.asc)
//通过uid降序排序
criteria.addOrder(Order.desc("uid"));
//通过criteria.list()得到数据集合
List<User> list = criteria.list();
//遍历输出每一条数据
for (User user : list) {
System.out.println(user);
}
//提交事务
transaction.commit();
//关闭资源
session.close();
}
- 聚合查询
/**
* 聚合查询
*/
@Test
public void test5() {
//获取session对象,通过自定义工具类获取,具体步骤见笔记一
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//类似指定要查询哪一张表
Criteria criteria = session.createCriteria(User.class);
/*
* criteria.setProjection(Projection projection)
* Projection的官方解释:
* 条件查询中查询结果集投影的面向对象表示。内置投影类型由投影工厂类提供。
* 这个接口可以由定义自定义投影的应用程序类实现。
* 简单来说,这个类就是用来定义聚合函数的,可以通过Projections这个静态工厂来得到不同的聚合函数
* 聚合函数有:avg:平均值,sum:总和,min:最小值,max:最大值,count:某字段不为空的记录数,rowcount:总记录数
*/
//获得uname字段不为空的记录数
criteria.setProjection(Projections.count("uname"));
//通过criteria.list()得到数据集合
Object object = criteria.uniqueResult();
System.out.println(object);
//提交事务
transaction.commit();
//关闭资源
session.close();
}