Hibernate中的各种查询(对象导航、OID、hql、QBC、本地SQL、多表)

Hibernate中的查询方式

1、对象导航查询

(1)根据id查询某个客户(Customer),然后再查询这个客户中的所有联系人(Linkman)

			//查询id为1的客户以及这个客户中的所有联系人
			Customer c1 = session.get(Customer.class, 1);
			//得到这个客户的set集合
			Set linkman = c1.getSetLinkMan();

2、OID查询

(1)根据id查询某一条记录,返回对象

session.get();

3、hql查询 hibernate query language

普通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 = query.list();
			for(Object c:list){
				System.out.println(c);
			} 
  

注意此时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类型

4、QBC查询

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);

5、本地sql查询

(1)创建SQLQuery对象,写普通sql语句实现查询

SQLQuery sqlQuery = session.createSQLQuery();

6、HQL多表查询

- 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

你可能感兴趣的:(Hibernate)