ssh|Hibernate03 -查询方式 OID hql QBC

Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC
Hibernate查询方式

  • 对象导航查询
    ? 根据id查询某个客户,再查询这个客户里面所有的联系人
  • OID查询
    ? 根据id查询某一条记录,返回对象
  • HQL查询
    ? Query对象,写hql语句实现查询
  • QBC查询
    ? Criteria对象
  • 本地sql查询
    ? SQLQuery对象,使用普通sql实现查询
对象导航查询
查询某个客户里面所有联系人过程,使用对象导航实现
代码:
// 根据cid=1客户 在查询这个客户所有的联系人 Customer customer = session.get(Customer.class, 1); // 在查询这个客户所有的联系人 // 直接得到客户里面联系人的set集合 Set linkManSet = customer.getLinkManSet(); System.out.println(linkManSet.size());

OID查询
根据id查询记录 可以根据session中get方法查询
Customer customer = session.get(Customer.class, 1);

HQL查询
Query对象,写hql语句实现查询
hql: hibernate query language 和普通的sql很相似
区别:
  • 普通sql操作的是数据库的表和表的字段
  • hql操作的是实体类和属性
Query对象:
  • 创建Query对象 ,写hql
  • 调用Query对象里面的方法 得到结果
常见的HQL语句
查询所有
// 创建query对象 (from 实体类名) Query query = session.createQuery("from Customer"); // 调用方法得到结果 List list = query.list(); for (Customer customer : list) { System.out.println(customer.getCid() +":"+customer.getCustName()); }

条件查询
from 实体类名称 where 实体类属性=?and 实体类属性=?
from 实体类名称 where 实体类属性 like ?模糊查询
代码:
【ssh|Hibernate03 -查询方式 OID hql QBC】注意: 新版本现在的占位符?后面要带上索引位置 新的jpa格式
// 创建query对象 // Query query = session.createQuery("from Customer where cid=? and custName=?"); // 起别名 Query query2 = session.createQuery("from Customer c where c.cid=?1 and c.custName=?2"); // 设置条件值 // setParameter方法中有两个参数 // 第一个参数: int类型是?位置从0开始 // 第二个参数: ?位置的值 query2.setParameter(1,1); query2.setParameter(2,"baidu"); // 调用方法得到结果 List list = query2.list(); for (Customer customer : list) { System.out.println(customer.getCid() + ":" + customer.getCustName()); }

排序查询 代码 降序desc 升序默认/asc
// 创建query对象 Query query = session.createQuery("from Customer order by cid desc"); List list = query.list(); for (Customer customer : list) { System.out.println(customer); }

分页查询 1 mysql实现分页
? 使用关键字 limit实现
2 在hql中实现分页
? 在hql操作中,在语句里面不能写limit,hibernate的Query对象封装两个方法实现分页操作
代码
// 创建query对象 // 写查询的操作 Query query = session.createQuery("from Customer "); // 设置分页数据 // 设置开始位置 query.setFirstResult(0); // 每页记录数 query.setMaxResults(2); List list = query.list(); for (Customer customer : list) { System.out.println(customer); }

投影查询
什么是投影查询?
? 查询部分属性(字段)的值…
? 语法
? select 实体类属性1,实体类属性2 from 实体类名称
? :select 后面不能写* 不支持的
代码实现
// 创建query对象 // 写查询的操作 Query query = session.createQuery("select custName from Customer "); List list = query.list(); for (Object o : list) { System.out.println(o); } // 多个字段 // 写查询的操作 Query query = session.createQuery("select custName,cidfrom Customer "); List list = query.list(); for (Object[] o : list) { System.out.println(o[0]+o[1]); }
聚集函数使用 常用的聚集函数
count、sum、avg、max、min
// 创建query对象 // 写查询的操作 Query query = session.createQuery("select count(*) from Customer "); // 调用方法得到结果 // query对象里面有方法,直接返回对象形式(object) // 本身返回的的long类型 Long o = (Long) query.uniqueResult(); // 使用Integer类型来接收 Integer i = o.intValue(); System.out.println(i);

HQL多表查询
内连接查询(两个表有联系) mysql
select * from t_customer c,t_linkeman l where c.cid = l.cid;
select * from t_customer c inner join t_linkman l on c.cid = l.cid
hql
//实体类属性 from Customer c inner join c.linkManSet // 返回的是数组

迫切内连接
from Customer c inner join fetch c.linkManSet // 返回的是Customer

迫切内连接和内连接区别:
? 迫切内连接返回的list每部分是对象
? 内连接返回的list每部分是数组
左外连接(全部显示) mysql
select * from t_customer c left outer join t_linkman l on c.cid = l.cid
hql
==
//实体类属性 from Customer c left outer join c.linkManSet // 返回的是数组

迫切左外连接
from Customer c left outer join fetch c.linkManSet // 返回的是Customer

右外连接(全部显示) mysql
select * from t_customer c right outer join t_linkman l on c.cid = l.cid
hql
fromCustomercrightouterjoinc.linkManSet

QBC查询
  • 使用hql查询需要写hql语句实现,但是使用qbc的时候 不需要写语句了,使用方法实现。
  • 使用qbc时候,操作实体类和属性
  • 使用qbc,使用Criteria对象实现
查询所有
// 创建Criteria对象 Criteria criteria = session.createCriteria(Customer.class); List list = criteria.list(); for (Customer customer : list) { System.out.println(customer); }

条件查询
// 创建Criteria对象 Criteria criteria = session.createCriteria(Customer.class); // 使用Criteria里面的方法设置条件值 // add方法 设置条件值 criteria.add(Restrictions.eq("cid",1)); criteria.add(Restrictions.eq("custName","baidu")); List list = criteria.list(); for (Customer customer : list) { System.out.println(customer); }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QShzvJ1M-1597224319457)(…/AppData/Roaming/Typora/typora-user-images/image-ssh|Hibernate03 -查询方式 OID hql QBC
文章图片

顺序查询
// 创建Criteria对象 Criteria criteria = session.createCriteria(Customer.class); // 设置对那个属性进行排序,设置排序规则 // criteria.addOrder(Order.asc("cid")); criteria.addOrder(Order.desc("cid")); List list = criteria.list(); for (Customer customer : list) { System.out.println(customer); }

分页查询
// 创建Criteria对象 Criteria criteria = session.createCriteria(Customer.class); // 设置分页开始位置 每页记录数 criteria.setFirstResult(0); criteria.setMaxResults(2);

统计查询(count)
// 设置操作 criteria.setProjection(Projections.rowCount()); // 调用方法 得到最后的结果 Object o = criteria.uniqueResult(); Long l = (Long) o; Integer i = l.intValue(); System.out.println(i); sion.createCriteria(Customer.class); // 设置分页开始位置 每页记录数 criteria.setFirstResult(0); criteria.setMaxResults(2);

统计查询(count)
// 设置操作 criteria.setProjection(Projections.rowCount()); // 调用方法 得到最后的结果 Object o = criteria.uniqueResult(); Long l = (Long) o; Integer i = l.intValue(); System.out.println(i);

Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC

    推荐阅读