(1)根据id查询某个客户(Customer),然后再查询这个客户中的所有联系人(Linkman)
//查询id为1的客户以及这个客户中的所有联系人
Customer c1 = session.get(Customer.class, 1);
//得到这个客户的set集合
Set linkman = c1.getSetLinkMan();
(1)根据id查询某一条记录,返回对象
session.get();
普通sql操作的是数据库表中的表明和字段,hql操作的是实体类和它的属性
(1)创建Query对象,写hql语句实现查询
- 查询所有:from 实体类名称
//查询所有 查询客户表中的所有记录
Query query = session.createQuery("from Customer");
List list = query.list();
- 条件查询
写法:from 实体类名称 where 实体类属性名称=? and 实体类属性名称=?
//用hql查询,第一步都要创建query对象
Query query = session.createQuery("from Customer where cid=?0 and custName=?1");
//设置条件值,位置从0开始
query.setParameter(0, 1);
query.setParameter(1, "湖北");
from 实体类名称 where 实体类属性名称 like
Query query = session.createQuery("from Customer where custName like ?0");
query.setParameter(0, "湖%");
- 排序查询
写法:from 实体类名称 order by 实体类属性名称 asc/desc
//排序查询
Query query = session.createQuery("from Customer order by cid desc");
- 分页查询
-- mysql实现分页,使用关键字limit
-- hql实现分页,hql语句中不能用limit,hibernate中query对象封装了两个方法实现
//分页查询
//查询所有
Query query = session.createQuery("from Customer");
//设置分页参数
//设置查询开始位置
query.setFirstResult(0);
//设置每页显示的记录条数
query.setMaxResults(4);
- 投影查询 查询部分字段的数据
-- select 实体类属性名称 from 实体类名称
-- select 后面不能用*
//投影查询
Query query = session.createQuery("select custName from Customer");
List
注意此时list中装的不再是Customer对象,而是Object对象,查询出的是字段名,不是对象
- 聚集函数的使用
-- 常用聚集函数:count、sum、avg、max、min
-- hql语句:select count(*) from 实体类名称
//聚集函数的使用
Query query = session.createQuery("select count(*) from Customer");
System.out.println(((Long)query.uniqueResult()).intValue());
query.uniqueResult()本身返回的是Long类型,要经过强转然后intValue()后才变为int类型
hql查询需要写hql语句实现,但是使用QBC不需要写语句,直接使用方法实现
使用QBC操作实体类和属性
使用Criteria对象
- 查询所有
(1)创建Criteria对象然后调用方法进行查询
//查询所有
//创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
List list = criteria.list();
- 条件查询
//条件查询
//创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//使用criteria对象的方法设置要查询的条件值
//使用add方法中的Restrictions对象设置查询条件
criteria.add(Restrictions.eq("cid", 1));
List list = criteria.list();
- 排序查询
//排序查询
//创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//设置对哪个属性进行排序以及排序规则
criteria.addOrder(Order.desc("cid"));
- 分页查询
//分页查询
//创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//设置分页数据
//设置开始位置
criteria.setFirstResult(1);
//设置每页的记录数
criteria.setMaxResults(4);
分页查询的开始位置计算公式:(当前页 - 1)* 每页记录数
- 统计查询
-- 得到表中的记录数
//统计查询
//创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//设置操作
criteria.setProjection(Projections.rowCount());
Object o = criteria.uniqueResult();
System.out.println(((Long)o).intValue());
- 离线查询
//离线查询
//创建离线Criteria对象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//最终执行的时候才会用到session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
(1)创建SQLQuery对象,写普通sql语句实现查询
SQLQuery sqlQuery = session.createSQLQuery();
- mysql中的多表查询
(1)内连接
/* 内连接查询 */
select * from t_customer t,t_linkman l where t.cid=l.clid
select * from t_customer t INNER JOIN t_linkman l on t.cid=l.clid
(2)左外连接
/* 左外连接查询 */
select * from t_customer c LEFT JOIN t_linkman l on c.cid=l.clid
(3)右外连接
/* 右外连接查询 */
select * from t_customer c RIGHT JOIN t_linkman l on c.cid=l.clid
- hql实现多表查询
(1)内连接
hql语法:from Customer c inner join c.setLinkMan
Query query = session.createQuery("from Customer c inner join c.setLinkMan");
(2)左外连接
hql语法:from Customer c left join c.setLinkMan
(3)右外连接
hql语法:from Customer c right join c.setLinkMan
(4)迫切内连接
-- 迫切内连接底层和内连接是一样的
-- 区别:内连接返回的list中每部分是一个数组,数组中包含了Customer和LinkMan对象,迫切内连接返回list的每部分都是对象
hql语法:from Customer c inner join fetch c.setLinkMan
//迫切内连接
Query query = session.createQuery("from Customer c inner join fetch c.setLinkMan");
List list = query.list();
list中存储的是Customer对象
(5)迫切左外连接
hql语法:from Customer c left join fetch c.setLinkMan