1 hibernate的查询方式

2 对象导航查询

3 hql查询
(1)查询所有
(2)条件查询
(3)排序查询
(4)分页查询
(5)投影查询
(6)聚集函数使用

4 qbc查询
(1)查询所有
(2)条件查询
(3)排序查询
(4)分页查询
(5)统计查询

5 hql多表查询
(1)mysql多表查询回顾
(2)hql多表查询

6 hibernate的检索策略
(1)概念
(2)具体操作

7 批量抓取

1 Hibernate查询方式
1 Hibernate框架中提供五种查询方式

第一种 对象导航查询
(1)根据id查询某个客户,调用get方法查询
(2)查询这个客户里面所有的联系人的过程,使用对象导航实现

第二种 oid查询(调用get方法查询)

(1)实体类有属性和表主键对应,主键唯一值,对应属性唯一值
(2)根据id查询,这种方式成为oid查询
(3)根据表主键查询

第三种 hql查询
(1)hql:hibernate提供查询语言,实现查询操作
(2)Query对象实现

第四种 qbc查询
(1)使用qbc查询没有语句,都是调用方法实现
(2)Criteria对象实现

第五种 本地sql查询
(1)在hibernate写普通sql语句实现
(2)SQLQuery对象实现
2 对象导航查询
1 根据ID查询客户,查询这个客户里面所有的联系人

2 根据id查询联系人,查询这个联系人所属客户

3 OID查询
1 根据主键查询

4 HQL查询(重点)
1 hql:hibernate提供查询语言

2 hql语句和sql语句区别:
(1)sql语句操作表和字段
(2)hql操作实体类和属性

3 使用hql查询需要使用Query对象

4 创建query对象

4.1 查询所有

//查询所有
@Test
public void testFindAll() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象Query query = session.createQuery("from Customer");//2 调用query的方法得到结果List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4.2 条件查询
1 条件查询
(1)根据客户名称和客户id查询

(2)hql语句写法:
from 实体类名称 where 属性名称1=? and 属性名称2=?

(3)调用方法向?设置条件值
有两个参数:第一个参数是?位置,第二个参数是条件值

//根据cid和custName查询
@Test
public void testFindCondition() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象//根据cid和custName查询String hql = "from Customer c where c.cid=? and c.custName=?";Query query = session.createQuery(hql);//2 设置条件值 ?值//?位置从0开始的query.setParameter(0,1);//设置第一个?值query.setParameter(1,"百度");//设置第二个?值//3 调用query的方法得到结果List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

2 模糊查询

(1)hql语句写法:

//根据custName模糊查询
@Test
public void testFindConditionDemo2() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象String hql = "from Customer c where c.custName like ?";Query query = session.createQuery(hql);//2 设置?值//模糊查询时候,需要值使用%设置匹配规则query.setParameter(0,"%百%");//3 调用方法得到结果List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4.3 排序查询

(1)hql语句写法
from 实体类名称 order by 排序属性名称 排序规则 asc/desc
//排序查询
@Test
public void testOrderby() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

        //1 创建query对象String hql = "from Customer order by cid desc";Query query = session.createQuery(hql);//2 调用方法结果List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4.4 分页查询
1 在mysql分页,使用limit关键字实现

(1)limit后面有两个参数
第一个参数是开始位置
第二个参数是每页记录数

2 使用hibernate框架,hql中没有提供分页语句
(1)hql提供两个方法实现分页

//分页查询
@Test
public void testPage() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象Query query = session.createQuery("from Customer");//2 设置分页数据//2.1 设置开始位置query.setFirstResult(0);//2.2 设置每页记录数query.setMaxResults(2);//3 结果List<Customer> list = query.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4.5 投影查询
1 查询表部分字段值

2 投影查询hql语句:
(1) select 属性名称1,属性名称2 from 实体类名称
(2)在hql语句中有select ,在select后面不能直接添加 *

3 查询所有custName值
//投影查询
@Test
public void testSelectDemo1() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

        //1 创建query对象Query query = session.createQuery("select custName from Customer");//2 结果List<Object> list = query.list();for (Object object : list) {System.out.println(object);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4 查询cid和custName值

//投影查询
@Test
public void testSelectDemo2() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象Query query = session.createQuery("select cid,custName from Customer");//2 结果//返回list集合每部分是数组形式List<Object[]> list = query.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

4.6 聚集函数使用
1 常用的聚集函数
count、sum、avg、max、min

2 查询表记录数hql语句
(1)select count(*) from 实体类名称

3 如果直接包object转换int类型报错

//聚集函数使用查询
@Test
public void testCount() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建query对象Query query = session.createQuery("select count(*) from Customer");//2 结果//如果查询返回一个值Object obj = query.uniqueResult();//把object转换int类型//变成long类型Long lobj = (Long) obj;//变成int//long类型长整型号,不能直接强转成int类型int count = lobj.intValue();System.out.println(count);tx.commit();}catch(Exception e) {e.printStackTrace();tx.rollback();}finally {session.close();sessionFactory.close();}
}

5 QBC查询(重点)
1 使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现

2 使用qbc时候,操作实体类和属性

3 使用qbc,使用Criteria对象实现
(1)创建Criteria对象
(2)调用方法得到结果

5.1 查询所有
//查询所有
@Test
public void testfindall() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

        //1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 调用方法得到结果List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

5.2 条件查询
1 条件查询
(1)根据cid和custName查询

//条件查询
@Test
public void testconditionDemo1() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 调用方法设置属性和条件值//2.1 add表示设置条件//2.2 使用Restrictions静态方法设置属性和值//eq方法 第一个参数是属性名称 ,第二个参数是条件值criteria.add(Restrictions.eq("cid",2));criteria.add(Restrictions.eq("custName","新浪"));//3 得到结果List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

2 模糊查询
(1)根据custName做模糊查询
//模糊查询
@Test
public void testconditionDemo2() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

        //1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 调用方法设置属性和条件值criteria.add(Restrictions.like("custName","%百%"));//3 得到结果List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

5.3 排序查询

有两个方法,一个升序,一个降序

//排序查询
@Test
public void testorderby() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 设置对哪个属性进行排序(排序规则)criteria.addOrder(Order.desc("cid"));//3 得到结果List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

5.4 分页查询
1 使用criteria里面的方法设置分页开始位置和每页显示记录数

//分页查询
@Test
public void testPage() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 设置分页信息//开始位置criteria.setFirstResult(0);//每页记录数criteria.setMaxResults(2);//3 得到结果List<Customer> list = criteria.list();for (Customer customer : list) {System.out.println(customer);}tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

5.5 统计查询

//统计查询
@Test
public void testcount() {SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try {sessionFactory = HibernateUtils.getSessionFactory();session = sessionFactory.openSession();tx = session.beginTransaction();//1 创建criteria对象Criteria criteria = session.createCriteria(Customer.class);//2 设置做统计功能criteria.setProjection(Projections.rowCount());//3 得到结果Object obj = criteria.uniqueResult();Long lobj = (Long) obj;int count = lobj.intValue();System.out.println(count);tx.commit();}catch(Exception e) {tx.rollback();}finally {session.close();sessionFactory.close();}
}

6 HQL多表查询
6.1 Mysql里面多表查询
1 内连接查询
(1)两个表有关联数据

2 左外连接
(1)左边表所有数据,右边表关联数据

3 右外连接
(1)右边表所有数据,左边表关联数据

6.2 HQL多表查询分类
1 内连接查询

2 迫切内连接查询

3 左外连接查询

4 迫切左外连接

5 右外连接查询

掌握
(1)hql多表查询语句写法

(2)内连接和迫切内连接区别
- 底层sql语句一样,都是内连接操作
- 内连接操作返回list中每部分是数组,迫切内连接返回list每部分是对象

(3)左外连接和迫切左外连接区别
- 底层sql语句一样,都是左外连接操作
- 左外连接返回list中每部分是数组,迫切左外连接返回list每部分是对象

 如果在实际项目中,做到多表查询,一般还是使用普通sql语句实现
 Hibernate调用普通sql语句,使用SQLQuery对象

6.3 HQL内连接
1 内连接查询hql语句写法:以客户和联系人为例
- hql语句操作实体类和属性

2 内连接语句: from 实体类名称 inner join 实体类set集合名称
from Customer c inner join c.setLinkMan
(1)返回list集合中,每部分是数组形式

3 迫切内连接语句
语句: from Customer c inner join fetch c.setLinkMan

6.4 HQL左外连接
1 左外连接hql语句: from Customer c left outer join c.setLinkMan

2 迫切左外连接hql语句:from Customer c left outer join fetch c.setLinkMan

4 右外连接hql语句:
(1)from Customer c right outer join c.setLinkMan

7 Hibernate检索策略(抓取)
7.1 检索策略的概念

1 在hibernate里面对查询操作做一些优化,检索策略是一种优化方式

2 hibernate检索策略分为两类
(1)立即查询
* 根据id查询操作,调用session里面get方法实现
* 当调用get方法之后,马上发送语句查询数据库

(2)延迟查询
* 根据id查询使用get方法,还有一个方法load方法,也可以根据id查询,load使用延迟查询的方法

3 延迟查询两类
(1)类级别延迟
* 做设置,设置load方法是否进行延迟效果,默认有延迟效果
* 对哪个实体类进行操作,在那个实体类所在映射文件中配置
在class标签上面使用lazy配置,默认值true表示延迟,设置false之后不延迟

(2)关联级别延迟
* 查询客户里面所有联系人过程,做延迟
* 查询联系人所属客户的过程,做延迟

7.2 关联级别延迟(了解)
1 在映射文件中进行配置实现
(1)根据客户得到所有的联系人,在客户映射文件中配置

2 在set标签上使用属性配置延迟效果
(0)根据客户查询所有的联系人,需要在客户映射文件中配置
(1)两个属性: fetch一般使用select, lazy使用true,默认效果延迟

(1)fetch:值select(默认) join
(2)lazy:值
- true:延迟(默认)
- false:不延迟
- extra:极其延迟

  • fetch值select,lazy值false时候,调用get之后发送两条语句,把客户和联系人都查询

  • fetch值select,lazy值extra时候,最终得到set集合数量,返回就是数量

3 在many-to-one标签使用属性配置
(0)根据联系人查询所属客户,在联系人映射文件中做延迟配置

如果lazy值false,调用get方法发送两条sql语句

(1)默认值:fetch是select,lazy是proxy
* 和客户映射文件class里面lazy值配置相关
如果lazy值true,做延迟;如果lazy值false,不做延迟

(2)proxy:根据customer映射文件中class标签lazy配置绝对是否延迟

int size = list.size();
for(int i=0;i

Hibernate各种查询方法相关推荐

  1. SSH学习-Hibernate关联查询

    与MyBatis类似,Hibernate也有关联查询,数据库中表与表之间的关联关系使用主外键的形式体现,实体对象之间的关联关系体现在对象与对象的引用.在Mybatis中,当涉及到复杂查询并且表之间存在 ...

  2. Hibernate 学习笔记(二)—— Hibernate HQL查询和 QBC 查询

    目录 一.Hibernate 的 HQL 查询 1.1.查询所有数据 1.2.条件查询 1.3.排序查询 1.4.统计查询 1.5.分页查询 1.6.投影查询 二.Hibernate 的 QBC 查询 ...

  3. Hibernate【查询、连接池、逆向工程】

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主 ...

  4. Hibernate hql 查询指定字段并获取结果集

    Hibernate hql 查询指定字段并获取结果集 在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况: 1.查询全部字 ...

  5. Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取

    一.hibernate的查询方式: 主要有五种:对象导航查询:OID查询:hql查询:QBC查询:本地sql查询. 1.对象导航查询:根据id查询某个客户,再查询这个客户里面所有的联系人. 2.OID ...

  6. 关于hibernate的查询

    为什么建议hibernate查询全部字段 一般而言,要查询什么字段就查询什么字段,不要select * from表,但是在hibernate,我们其实可以不遵循这个规则,建议我们把所有属性都查询出来( ...

  7. (3) Hibernate的查询 标准(Criteria)查询

    Hibernate的查询 标准(Criteria)查询 1 一个简单例子: Java代码   @SuppressWarnings("unchecked") public void ...

  8. hibernate批量查询_使用Hibernate批量获取

    hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...

  9. hibernate oracle查询最大值_Java大数据:Mybatis和Hibernate对比分析

    在Java企业级平台开发任务当中,持久层框架的选择,Mybatis和Hibernate都占据一定的市场.从大趋势来说,传统企业偏爱Hibernate,而互联网更偏爱Mybatis.今天的大数据基础分享 ...

最新文章

  1. -bash:syntax error near unexpected token '('
  2. vba保存文件为xlsx格式_Vba把Excel某个范围保存为XLS工作薄文件
  3. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
  4. gp338信令_【对讲机的那点事】摩托罗拉GP338的MDC1200信令选呼如何编程?
  5. learning to rank
  6. excel帮助文档_可以惊艳到你的6个excel基础技巧
  7. php 接受 amp,php中amp;amp;和||的用法
  8. Linux设置封包报头的函数,GitHub - LinuxDigger/RTMP
  9. java 引用 判断_[JAVA基础]你知道Java的四种引用类型吗
  10. Redis基本数据类型、应用场景、操作指令
  11. iOS-深复制(mutableCopy)与浅复制(copy)
  12. 将.ncm文件转换为.mp3文件
  13. 简单易懂的PyTorch版VGG19复现代码
  14. 整车车辆七自由度垂向动力学模型
  15. 美智库:马赛克战是人工智能与自主系统支撑的决策中心战
  16. Redis 使用场景
  17. python 循环嵌套break continue猜字游戏_Python代码的人机大战(循环嵌套)
  18. Python123.io---斐波纳契数列 I
  19. Java版本便签纸小项目
  20. css3 keyframes zoom,CSS3 @keyframes 规则 | w3cschool菜鸟教程

热门文章

  1. 前台替换用户名部分转换为*显示
  2. 人工智能:语音识别技术介绍
  3. 蛋白质的数据预处理个人笔记(2)
  4. 专访深蓝航天CEO霍亮:做中国版梅林发动机 深耕火箭回收复用赛道
  5. Latex编译报错 “Undefined control sequence. \chapter“
  6. 富士施乐248b粉盒清零_打印机DocuPrintM228B如何清零
  7. 搜索引擎优化 SEO攻略大全
  8. php 实现邮件定时发送,php定时发送邮件解决方案
  9. 可视化篇:Echarts3.0引入百度地图(更新)
  10. 收购快钱做线下支付,京东数科与蚂蚁终有一战?