Hibernate第十篇【Hibernate查询详解、分页查询】

前言

在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式….到目前为止,我们都是使用一些简单的主键查询阿…使用HQL查询所有的数据….本博文主要讲解Hibernate的查询操作…

get/load主键查询

由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来…

  • get()立即查询
    • 这里写图片描述
  • load()懒加载
    • 这里写图片描述

对象导航查询

如果对象与对象之前存在一对多、多对一的关系的时候

  • 在以前SQL查询的时候:我们如果想要得到当前对象与另一对象的关联关系的时候,就必须用多表查询来得到数据
  • Hibernate提供了对象导航查询:我们可以使用主键查询完之后,得到的对象,直接使用对象得到集合…就可以得到对应的数据了。
        // 对象导航查询
        Dept dept =  (Dept) session.get(Dept.class, 12);
        System.out.println(dept.getDeptName());

        //这里就可以得到部门对应的所有员工
        System.out.println(dept.getEmps());

HQL查询

在Hibernate的第二篇已经讲解过了基本的概念了。在这里我们就直接看看怎么使用了。

值得注意的是:

  • 在hbm.xml文件中的auto-import=”true” 要设置true。当然了,默认值就是ture
  • 如果是false,写hql的时候,要指定类的全名

查询全部列

    //方式一:直接写对象
    Query q = session.createQuery("from Dept");

    //方式二:可以为对象取别名
    Query q = session.createQuery("select d from Dept d");

值得注意的是:HQL不支持*号,下面的代码是错误的。

    //不能用*
    Query q = session.createQuery("select d from Dept d"); 

查询指定的列

值得注意的是:使用HQL查询指定的列,返回的是对象数组Object[]

        //只查询name和eatBanana列
        Query query = session.createQuery("select m.name,m.eatBanana from Monkey m");
        System.out.println(query.list());

这里写图片描述

封装对象

前面测试了查询指定的列的时候,返回的是对象数组…可是对象数组我们不好操作啊…Hibernate还提供了将对象数组封装成对象的功能

  • JavaBean要有对应的构造函数
        Query query = session.createQuery("select new Monkey(m.name,m.eatBanana )from Monkey m");

条件查询

在SQL中条件查询我们也用得比较多,我们来看看HQL中的条件查询有什么新特性。

占位符

占位符就是指?号,我们在SQL中也常常用…


        Query query = session.createQuery("from Monkey m where m.name=?");
        //HQL是从0开始的
        query.setParameter(0, "大猴子");

        System.out.println(query.list());

这里写图片描述


命名参数

HQL还支持命名参数查询!下面我们来看一下怎么用:

语法::命名


        Query query = session.createQuery("from Monkey m where m.name=:monkeyName");
        //HQL是从0开始的
        query.setParameter("monkeyName", "大猴子");
        System.out.println(query.list());

这里写图片描述


范围查询

范围查询就是使用between and关键字来查询特定范围的数据。。和SQL是一样的…

        Query q = session.createQuery("from Dept d where deptId between ? and ?");
        q.setParameter(0, 1);
        q.setParameter(1, 20);
        System.out.println(q.list());

模糊查询

模糊查询就是使用Like关键字进行查询,和SQL也是一样的。

  • %号要写在参数上,不能写带SQL上!

        //模糊
        Query q = session.createQuery("from Dept d where deptName like ?");
        q.setString(0, "%部%");
        System.out.println(q.list());

聚合函数统计

我们也经常会查询数据库中一共有多少条记录这样的需求。那么在HQL中怎么用呢?

  • HQL提供了uniqueResult()这么一个方法,返回只有一条记录的数据
        Query query = session.createQuery("select COUNT(*) from Monkey");
        Object o = query.uniqueResult();
        System.out.println(o);

这里写图片描述


分组查询

分组查询和SQL是一样的…


        //-- 统计t_employee表中,每个部门的人数
        //数据库写法:SELECT dept_id,COUNT(*) FROM t_employee GROUP BY dept_id;
        // HQL写法
        Query q = session.createQuery("select e.dept, count(*) from Employee e group by e.dept");
        System.out.println(q.list());

连接查询

连接查询也就是多表查询…多表查询有三种

  • 内连接【等值连接】
  • 左外连接
  • 有外链接

值得注意的是:连接查询返回的也是对象数组!


        //1) 内连接   【映射已经配置好了关系,关联的时候,直接写对象的属性即可】
        Query q = session.createQuery("from Dept d inner join d.emps");

        //2) 左外连接
        Query q = session.createQuery("from Dept d left join d.emps");

        //3) 右外连接
        Query q = session.createQuery("from Employee e right join e.dept");
        q.list();

迫切连接

由于连接查询返回的是对象数组,我们使用对象数组来操作的话会很不方便…既然是连接查询,那么对象与对象是肯定有关联关系的…于是乎,我们想把左表的数据填充到右表中,或者将右表的数据填充到左表中…使在返回的时候是一个对象、而不是对象数组!**HQL提供了**fetch关键字供我们做迫切连接~


        //1) 迫切内连接    【使用fetch, 会把右表的数据,填充到左表对象中!】
        Query q = session.createQuery("from Dept d inner join fetch d.emps");
        q.list();

        //2) 迫切左外连接
        Query q = session.createQuery("from Dept d left join fetch d.emps");
        q.list();

查询语句放在配置文件中【命名查询】

我们可以在具体的映射配置文件中存放一些常用的语句。以Dept为例


    <!-- 存放sql语句,如果有<>这样的字符数据,需要使用CDATA转义! -->
    <query name="getAllDept">
        <![CDATA[
            from Dept d where deptId < ?
        ]]>
    </query>

在程序中,我们可以获取配置文件配置的语句

        Query q = session.getNamedQuery("getAllDept");
        q.setParameter(0, 10);
        System.out.println(q.list());

Criteria 查询

Criteria是一种完全面向对象的查询…

Criteria使用的是add()来添加条件。条件又使用一个Restrictions类来封装


        Criteria criteria = session.createCriteria(Monkey.class);
        criteria.add(Restrictions.eq())

我们来简单看一下Restrictions的方法:

这里写图片描述

都是一些大于、小于、等于之类的….Criteria查询就使用不了分组、连接查询了。


SQLQuery本地SQL查询

有的时候,我们可能表的结构十分复杂,如果使用关联映射的话,配置文件是十分臃肿的…因此,我们并不是把全部的数据表都使用映射的方式来创建数据表…

这时,我们就需要用到SQLQuery来维护我们的数据了..

SQLQuery是不能跨数据库的,因为Hibernate在配置的时候就指定了数据库的“方言”…


        SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM monkey_ limit 0,3");

        System.out.println(sqlQuery.list());

返回的也是对象数组:

这里写图片描述

Hibernate也支持在SQLQuery中对数据进行对象封装..只要添加类型就行了


        SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM monkey_ limit 0,3").addEntity(Monkey.class);

        System.out.println(sqlQuery.list());

这里写图片描述


分页查询

传统的SQL我们在DAO层中往往都是使用两个步骤来实现分页查询

  • 得到数据库表中的总记录数
  • 查询起始位置到末尾位数的数据

Hibernate对分页查询也有很好地支持,我们来一下:


        Query query = session.createQuery("from Monkey");

        //得到滚动结果集
        ScrollableResults scroll = query.scroll();
        //滚动到最后一行
        scroll.last();
        int i = scroll.getRowNumber() + 1;
        System.out.println("总计路数:" + i);

        //设置分页位置
        query.setFirstResult(0);
        query.setMaxResults(3);

        System.out.println(query.list());
  • 提供了方法让我们设置起始位置和结束位置
  • 提供了ScrollableResults来得到滚动结果集,最终得到总记录数

值得注意的是,滚动结果集是从0开始的,因此需要+1才可得到总记录数!

这里写图片描述


如果我们们使用的是SELECT COUNT(*) FROM 实体,我们可以通过uniqueResult()方法获取数据的唯一记录,得到的数据转换成Long类型即可。

    Long totalRecord = (Long) queryCount.uniqueResult();
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
Hibernate 多表连接分页查询示范项目 Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页 立即下载

相关推荐

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1037

hibernate4从入门到大神(备java基础,mysql,javaee经典框架)

Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate映射技术,Hibernate多表联合查询, Hibernate二级缓存技术,Hibernate分页技术,Hibernate性能优化技术。

UE5 StateTree实战:用分层状态机重构你的AI行为逻辑(附蓝图配置避坑点)

本文详细介绍了UE5中StateTree分层状态机的实战应用,帮助开发者重构AI行为逻辑。通过核心概念解析、迁移策略、高级技巧和避坑指南,展示了StateTree在灵活性、可维护性和并行处理方面的优势,特别适合复杂AI行为的开发与优化。

weixin_42558257的博客 249

hibernate的分页查询

hibernate实现分页查询 第一我们需要一个定义页面的类 public class Page { 9 /** 10 * 其中currentPage,perPageRows这两个参数是做分页查询必须具备的参数 11 * 原因是:hibernate中的Criteria或则是Query这两个接口:都有setFirstResult(Integer firstResu...

exit_back的博客 1万+

.NET+Vue企业级RBAC权限平台:开箱即用的生产就绪方案

RBAC(基于角色的访问控制)是企业系统安全治理的基础模型,其核心在于将用户、角色与权限解耦,通过动态能力组合实现细粒度管控。在真实工程中,RBAC需突破静态角色限制,支持时间维度授权、前后端双重鉴权、行级数据范围控制等关键能力。本文聚焦于一套已落地金融、政务、制造等多行业的生产级实现——基于.NET Minimal API与Vue 3的前后端分离架构,提供菜单/按钮/接口/数据四层权限控制,内置滑动过期JWT、Redis权限缓存、动态路由加载与权限指令等开箱即用能力,显著降低权限配置与审计成本。

weixin_33326218的博客 275

CVE-2017-7921漏洞深度剖析:从身份验证绕过到实战复现与防御

身份验证是Web应用安全的核心防线,其逻辑缺陷可能导致严重的未授权访问。身份验证绕过漏洞的原理在于,应用程序对特定请求路径或API接口的访问控制策略存在疏漏,未能执行有效的会话或令牌校验。这类漏洞的技术价值在于,攻击者无需凭证即可直接访问受保护的后端资源,从而获取敏感信息或执行未授权操作,对系统机密性、完整性构成直接威胁。在物联网和安防监控领域,大量网络摄像头、录像机等设备暴露于公网,其Web管理界面便成为常见攻击面。本文聚焦于安防设备中一个经典的CVE-2017-7921身份验证绕过漏洞,通过剖析其技术原

WGH100817的博客 471

hibernate分页查询

首先,使用hibernate实现分页查询, 1.要编写HQL或者使用查询语句(注意HQL要调用session.createQuery/查询条件调用Session的createCriteria方法) 2.设置查询起始行数和最大查询行数、获取数据(setFirstReuslt/setMaxResult、query.list) 下面是具体的实现过程: 一。定义一个页面类 public class PageInfo<>{ private List<E> rows;//数据集 privat

yemers的博客 1390

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

Hibernate实现分页查询的原理分析

Hibernate 可以实现分页查询,例如: 从第2万条开始取出100条记录   代码 Query q = ses

davidmr_001的专栏 3440

Altium Designer铺铜陷阱:为什么你的死铜总是清除不干净?

本文深入探讨Altium Designer中铺铜操作导致死铜无法清除的常见问题,分析死铜形成的五大诱因,并提供高级参数优化和网络连接性验证技巧。通过调整边界计算精度和泪滴算法设置,有效解决死铜残留问题,提升PCB设计质量与制造良率。

weixin_29169505的博客 359

高压控制单元与接触器 —— BMS电池的“高压大门”

高压接触器在BMS电池管理系统中扮演着“高压大门”的角色,负责控制电池包与整车高压母线的连接与隔离。接触器的工作原理基于线圈产生的磁力吸合接点,通过主触点接通高压电流路径,辅助触点检测状态,灭弧结构保护接点。预充电路的设计是为了避免直接连接大电容时产生的浪涌电流冲击,通过预充电阻逐步充电,确保系统安全上电。接触器控制策略包括顺序控制、辅助触点检测、温度监控、故障断电和背靠背MOS辅助控制,以确保系统的高效和安全运行。工程师在选择接触器型号、控制线圈、检测状态、软件冗余控制和预充失败保护等方面提供了具体建议。

weixin_43199439的博客 813

mysql hibernate 分页查询_hibernate分页查询,如何用hibernate实现分页查询?

之前给大家介绍了一下hibernate框架,那么下面要接着讲到的就是hibernate实现分页查询的内容,一起来看看具体的实现方式吧。分页查询就是将数据库当中某一张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类。大家可以仔细看看,有非常详细的注解。packagecom.entity;/***@author:秦林森*/importjavax.persistenc...

weixin_28979339的博客 759

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Hibernate入门实例——Hibernate分页查询

package com.metis.hibernate.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import com.metis.hibernate.domain.Person; import com.metis.hibernate.util.HibernateUtil; /**

weoln的专栏 3996

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

基于Hibernate的分页查询

分页查询数据上基本上是我们做web网站等项目必须要做功能,基于Hibernate查询的分页查询也是如此。 那么,基于Hibernate的分页查询到底是如何实现的呢?一下我将一一向大家展示,如有任何疑问,欢迎留言。后台数据查询: // 分页显示所有的数据 public List pageCountryList(int pageNum, int pageSize) { // pageSi...

My52Hz 3578

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

用Hibernate实现分页查询

分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: 1 package com.entity; 2 /** 3 * @author:秦林森 4 */ 5 6 import javax.persistence.criteria.CriteriaBuilder; 7 8 public clas...

一只苟延残喘的卑微蝼蚁 659

jpa hibernate分页查询

工具类pageutils /** * 当前页 */ private int currentPage; /** * 每页数据条数 */ private int pageSize; /** * 经销商 */ private Dealer dealer; /** * 贷款 */ private Loan loan; /** * 起始时间

malachi95的博客 1394

oracle分页怎么查询,Oracle的分页查询详解

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM...

weixin_39825854的博客 1678

Hibernate分页查询原理解读

Hibernate 可以实现分页查询,例如:   从第2万条开始取出100条记录   Query q = session.createQuery("from Cat as c");   q.setFirstResult(20000);   q.setMaxResults(100);   List l = q.list();   那么Hibernate底层如何实现分页的呢?实际上Hibernate的

吾欲乘风 1225

JDBC的分页查询以及hibernate高级查询分页

JDBC的分页查询以及hibernate高级查询分页 第一种方法: 、 BookBean.java package com.mingrisoft.copy2; /** * Title: BookBean * Description: 数据库tb_book表对应实体类 * @author Peng * @date 下午7:39:41 */ public class Bo...

zhupengqq的博客 238

Hibernate分页查询

Hibernate分页查询代码实现 代码实现 public PageDataDomain<DataSourceDataFindAllBySourceId> displayDate(Integer pageNumber, Integer pageSize, String keyWord, Long dataSourceId) { PageDataDomain<DataSourceDataFindAllBySourceId> pageDataDomain = new

qq_43419105的博客 296
上一篇: Hibernate第九篇【组件映射、继承映射】
下一篇: Hibernate第十一篇【配置C3P0数据库连接池、线程Session】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值