Hibernate各种查询方法_hibernatr 规定方法名查询-程序员宅基地

技术标签: hibernate框架  Hibernate查询  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LikeXiaoYing/article/details/80896881

智能推荐

手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)_eclipse安装教程-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏16次。写这篇文章的由来是因为后边要用这个工具,但是由于某些原因有部分小伙伴和童鞋们可能不会安装此工具,为了方便小伙伴们和童鞋们的后续学习和不打击他们的积极性,因为80%的人都是死在工具的安装这第一道门槛上,这门槛说高也不高说低也不是太低。所以就抽时间水了这一篇文章。_eclipse安装教程

分享11个web前端开发实战项目案例+源码_前端项目实战案例-程序员宅基地

文章浏览阅读4.1w次,点赞12次,收藏193次。小编为大家收集了11个web前端开发,大企业实战项目案例+5W行源码!拿走玩去吧!1)小米官网项目描述:首先选择小米官网为第一个实战案例,是因为刚开始入门,有个参考点,另外站点比较偏向目前的卡片式设计,实现常见效果。目的为学者练习编写小米官网,熟悉div+css布局。学习资料的话可以加下web前端开发学习裙:600加上610再加上151自己去群里下载下。项目技术:HTML+CSS+Div布局2)迅雷官网项目描述:此站点特效较多,所以通过练习编写次站点,学生可以更多练习CSS3的新特性过渡与动画的实_前端项目实战案例

计算质数-埃里克森筛法(间隔黄金武器)-程序员宅基地

文章浏览阅读73次。素数,不同的质数,各种各样的问题总是遇到的素数。以下我们来说一下求素数的一种比較有效的算法。就是筛法。由于这个要求得1-n区间的素数仅仅须要O(nloglogn)的时间复杂度。以下来说一下它的思路。思路:如今又1-n的数字。素数嘛就是除了1和本身之外没有其它的约数。所以有约数的都不是素数。我们从2開始往后遍历,是2的倍数的都不是素数。所以我们把他们划掉然后如...

探索Keras DCGAN:深度学习中的创新图像生成-程序员宅基地

文章浏览阅读532次,点赞9次,收藏14次。探索Keras DCGAN:深度学习中的创新图像生成项目地址:https://gitcode.com/jacobgil/keras-dcgan在数据驱动的时代,图像生成模型已经成为人工智能的一个重要领域。其中,Keras DCGAN 是一个基于 Keras 的实现,用于构建和训练 Deep Convolutional Generative Adversarial Networks(深度卷积生...

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):_spring-could org.apache.ibatis.binding.bindingexce-程序员宅基地

文章浏览阅读116次。今天在搭建springcloud项目时,发现如上错误,顺便整理一下这个异常:1. mapper.xml的命名空间(namespace)是否跟mapper的接口路径一致<mapper namespace="com.baicun.springcloudprovider.mapper.SysUserMapper">2.mapper.xml接口名是否和mapper.java接..._spring-could org.apache.ibatis.binding.bindingexception: invalid bound state

四种高效数据库设计思想——提高查询效率_数据库为什么能提高效率-程序员宅基地

文章浏览阅读1.1k次。四种高效数据库设计思想——提高查询效率:设计数据库表结构时,我们首先要按照数据库的三大范式进行建立数据。1. 1NF每列不可拆分2. 2NF确保每个表只做一件事情3. 3NF满足2NF,消除表中的依赖传递。三大范式的出现是在上世纪70年代,由于内存资源比较昂贵,所以严格按照三大范式进行数据库设计。而如今内存变得越来越廉价,在考虑效率和内存的基础上我们可以做出最优选择以达到最高效率。_数据库为什么能提高效率

随便推点

什么是配置_基于配置是什么意思-程序员宅基地

文章浏览阅读1.6k次。应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。配置主要有以下几个特点:配置是独立于程序的只读变量配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置配置伴随应用的整个生命周期配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。配置可以有多种加载方式常见的有程序内部_基于配置是什么意思

二、使用GObject——一个简单类的实现-程序员宅基地

文章浏览阅读170次。Glib库实现了一个非常重要的基础类--GObject,这个类中封装了许多我们在定义和实现类时经常用到的机制: 引用计数式的内存管理 对象的构造与析构 通用的属性(Property)机制 Signal的简单使用方式 很多使用GObject..._

golang 定时任务处理-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏9次。在 golang 中若写定时脚本,有两种实现。一、基于原生语法组装func DocSyncTaskCronJob() { ticker := time.NewTicker(time.Minute * 5) // 每分钟执行一次 for range ticker.C { ProcTask() }}func ProcTask() { log.Println("hello world")}二、基于 github 中封装的 cron 库实现package taskimport (_golang 定时任务

VC获取精确时间的方法_vc 通过线程和 sleep 获取精准时间-程序员宅基地

文章浏览阅读2.1k次。 来源:http://blog.csdn.net/clever101/archive/2008/10/18/3096049.aspx 声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法。非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出。 对关注性能的程序开发人员而言,一个好的计时部件既是益友,也_vc 通过线程和 sleep 获取精准时间

wml入门-程序员宅基地

文章浏览阅读58次。公司突然说要进行wap开发了,以前从没了解过,但我却异常的兴奋,因为可以学习新东西了,呵呵,我们大家一起努力吧。首先说说环境的搭建。可以把.wml的文件看做是另一种的html进行信息的展示,但并不是所有的浏览器都支持,好用的有Opera,还有WinWap。编写wml文件语法比较严格,不好的是我还没有找到好的提示工具,就先用纯文本吧。我找到了一个很好的学习网站:http://w3sc..._winwap学习

计算机考研怎么给老师发邮件,考研复试前,手把手教你怎么给导师发邮件!4点要注意...-程序员宅基地

文章浏览阅读504次。考研成绩出来后,第一件事是干什么?当然不只是高兴,而是马上给心仪的导师发邮件,先露个“名字熟”。不要以为初试考了高分或者过线了,一切都稳妥了,一时得意忘形,居然没联系导师,等想起时,导师已经属于他人了。对于一些大佬,热门导师一定要趁早发邮件咨询,一是表示尊重;二是这类老师可能已经没有统招名额,所以越早知道,越有利于下一步计划。但是,在给导师发邮件中,要注意以下4点,不求一步成功,但求先留下个好印象..._跨考计算机怎么给导师发邮件