从零打造在线网盘系统之Hibernate查询与更新技术

欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重地阐述SSH三个框架的基础知识,第四部分将会进入项目实战,如果您已经对SSH框架有所掌握,那么可以直接浏览第四章,源码均提供在GitHub/ssh-network-hard-disk上供大家参阅

本章学习目标

  1. 掌握标准查询API的使用
  2. 掌握QBE
  3. 掌握HQL
  4. 掌握SQL

本篇前言

在前面两篇文章中我们基本会使用Hibernate操作数据库,但是基本都是使用的是Session接口进行操作,像这种根据索引进行检索数据库局限性非常大.为此Hibernate提供了很强大的查询技术,例如标准查询API,QBE,HQL,SQL等

标准查询API

要想使用标准查询API就要用到Hibernate的org.hibernate.Criteria接口,通过Session.createCriteria既可以创建Criteria对象

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Criteria criteria = session.createCriteria(Product.class);
        criteria.setMaxResults(2);
        List list = criteria.list();
        for (Object var : list) {
            System.out.print(var.toString());
        }
        session.close();
    }

在使用标准API进行查询的时候增加约束条件是一个SimpleExpression对象,由org.hibernate.criterion.Restrictions类的静态方法可以获得相应的SimpleExpression对象.

criteria.add(Restrictions.eq("name", "中药"));

我们同样可以进行模糊匹配

criteria.add(Restrictions.like("name", "%中%"));

使用MatchMode类静态常量,模糊匹配我们也可以这样也是一样的

criteria.add(Restrictions.like("name", "中", MatchMode.ANYWHERE));

在增加查询的约束条件的时候我们会这样使用,查询成绩大于90的学生并且是女生,或者怎么怎么样....,我们可以使用LogicalExpression改变他们的逻辑

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Criteria criteria = session.createCriteria(Product.class);
        SimpleExpression id1 = Restrictions.eq("id", 1);
        SimpleExpression id11 = Restrictions.eq("id", 11);
        LogicalExpression logicalExpression = Restrictions.or(id1, id11);
        criteria.add(logicalExpression);
        List list = criteria.list();
        for (Object var : list) {
            System.out.print(var.toString());
        }
        session.close();
    }

可以看到使用LogicalExpression逻辑变得非常臃肿,Hibernate提供了更便捷的解决方案,那就是使用Conjunction生成And关系,使用Disjunction生成or关系

        Disjunction disjunction = Restrictions.disjunction();
        disjunction.add(id1);
        disjunction.add(id11);
        criteria.add(disjunction);
        Conjunction conjunction = Restrictions.conjunction();
        conjunction.add(id1);
        conjunction.add(id11);
        criteria.add(conjunction);

那么如何使用标准查询API进行分页查询呢?得益于Hibernate对不同数据库的封装,我们可以很便捷地进行分页,例如xxxxx limit0, 10这样的SQL我们平时经常见到,我们可以使用Criteria接口两条语句即可实现分页功能

        criteria.setFirstResult(0);
        criteria.setMaxResults(10);

您阅读到这里的时候可以发现Criteria接口返回的都是List对象,如果我们知道一条索引id,我们根绝这个id去进行去进行查找,就没必要返回给我一个List集合了吧? 同样我们可以使用uniqueResult方法返回一个Object对象

        Session session = HibernateSessionFactory.getSession();
        Criteria criteria = session.createCriteria(Product.class);
        criteria.add(Restrictions.eq("id",1));
        Product product = (Product) criteria.uniqueResult();

在处理多个实体Bean关联的情况下我们需要处理多个Criteria之间的关联,我们可以通过Criteria创建另一个Criteria对象,参数是一个属性名

        Session session = HibernateSessionFactory.getSession();
        Criteria productCriteria = session.createCriteria(Product.class);
        Criteria productDetailCriteria = productCriteria.createCriteria("productDetail");
        productDetailCriteria.add(Restrictions.eq("detatil", "肯定匹配不到我"));
        List list = productCriteria.list();

我们可以使用AggregateProjection类进行聚合操作查询,例如查询一个表中的记录数

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Criteria criteria = session.createCriteria(Product.class);
        criteria.setProjection(Projections.rowCount());
        Long count = (Long) criteria.uniqueResult();
    }

QBE(Query By Example)

除了使用标准查询API,我们还可以使用QBE进行查询

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Criteria criteria = session.createCriteria(Product.class);
        Product product = new Product();
        product.setName("中药");
        criteria.add(Example.create(product));
        List list = criteria.list();
    }

HQL(Hibernate Query Language)

HQL是Hibernate框架提供的另一种操作数据的方式,其语法非常接近SQL,但却是面向对象的也就是说HQL所操作的都是持久化对象,而不是数据表

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Query from_product = session.createQuery("from Product");
        List list = from_product.list();
    }

我们在进行复杂的查询HQL都是游刃有余的

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Query from_product = session.createQuery("select name from Product where id >0 or id<10");
        List list = from_product.list();
    }

HQL和JDBC一样是支持占位符查询的

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Query from_product = session.createQuery("select name from Product where id > :id");
        from_product.setInteger("id", 0);
        List list = from_product.list();
    }

HQL进行分页查询跟标准查询API很是相似

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Query from_product = session.createQuery("from Product");
        from_product.setFirstResult(0);
        from_product.setMaxResults(10);
        List list = from_product.list();
    }

HQL同样支持聚合查询

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Query from_product = session.createQuery("select count(*) from Product");
        Long count = (Long) from_product.uniqueResult();
    }

HQL作为一种查询语言同样支持Update/Delete/Insert

    Query from_product = session.createQuery("xxxxxxx");
    from_product.executeUpdate();

SQL

虽然HQL可以完成大多数的操作,但是HQL并不支持数据库的所有特性,因此在需要的时候我们还是需要直接使用SQL操作数据库

    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        NativeQuery sqlQuery = session.createSQLQuery("select * from products p");
        sqlQuery.addEntity("p", Product.class);
        List<Product> list = sqlQuery.list();
    }

本篇总结

掌握Hibernate的查询与更新技术,能在Hibernate框架的任意场景中熟练运用各种查询与更新技术

原文地址:https://www.cnblogs.com/jimisun/p/9939831.html

时间: 2024-11-06 10:25:17

从零打造在线网盘系统之Hibernate查询与更新技术的相关文章

从零打造在线网盘系统之Hibernate配置O/R映射

欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重地阐述SSH三个框架的基础知识,第四部分将会进入项目实战,如果您已经对SSH框架有所掌握,那么可以直接浏览第四章,源码均提供在GitHub/ssh-network-hard-disk上供大家参阅 本篇学习要求 主键映射 普通属性映射 组件映射 一对一关联映射 多对一单向关联映射 多对一双向关联映射

从零打造在线网盘系统之Struts2框架起步

欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重地阐述SSH三个框架的基础知识,第四部分将会进入项目实战,如果您已经对SSH框架有所掌握,那么可以直接浏览第四章,源码均提供在GitHub/ssh-network-hard-disk上供大家参阅 本篇目标 掌握Struts2工作流程 掌握Struts2控制器 掌握Struts2XML配置 掌握Str

从零打造在线网盘系统之Struts2框架配置全解析

欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重地阐述SSH三个框架的基础知识,第四部分将会进入项目实战,如果您已经对SSH框架有所掌握,那么可以直接浏览第四章,源码均提供在GitHub/ssh-network-hard-disk上供大家参阅 要想学好一个框架,就必须要学好如何配置好这个框架,下面让我们大体上来一起来了解一下Struts2的相关配

vue+nodejs+express+mysql 建立一个在线网盘程序

vue+nodejs+express+mysql 建立一个在线网盘程序 目录 vue+nodejs+express+mysql 建立一个在线网盘程序 第一章 开发环境准备 1.1 开发所用工具简介 1.2 安装 MySQL 1.2.1 下载安装 MySQL 1.2.2 可能出现的问题和解决方案 1.3 安装 vue-cli 1.4 安装 express 第二章 数据库设计和创建 2.1 数据库和表设计 2.2 user 表 2.3 file 表 2.4 创建数据库和表所用 sql 语句参考 第三

打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源

前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字游戏中的公司都心知肚明. 在不需要增加任何网盘上传下载带宽和硬件设备投入的情况下,又可以用TB级别网盘这样的字眼来夺人眼球,在网络上大肆炒作一番,这比用钱买广告来推广网盘有效得多了.在这场网盘炒作中,率先“挑起事非”的两家百度网盘和360网盘获利最多. 尤其是百度网盘,应该算正式成长为国内网盘界中老

project02 U盘系统与排错系统

U盘系统与排错系统 制作U盘系统的两个主要目的: 1.以U盘为救援系统来修复有故障无法启动操作系统 修复步骤: 1)选尝试从单用户模式启动(内核和基本服务,可以参考/etc/rc.d/rc1.d/S..) 2)如果单用户模式也无法正常启动,可以考虑从光盘或者是U盘启一个linux操作系统,首选使用U盘 2.通过U盘系统的制作让你更了解一个主机上linux系统组成,以及启动流程 LINUX操作系统的组成: 内核 SHELL 应用程序 文件系统 内核 核心文件    vmlinuz 临时根文件  i

电子政务私有云盘系统建设必备-Mobox政务盘

序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避免信息孤岛完成信息系统互联互通.信息共享和业务协同已经成为智慧政务私有云盘系统建设的重要任务. 结合硬件性能提升.云计算.大数据.移动.社交的发展趋势,政府行业在建设智慧政务私有云盘系统的进程中存在以下问题: 存在大量的非结构化数据 随着政府行业新业务不断上线,例如:数字化法庭系统.头像识别系统.社

清理C盘系统垃圾文件-批处理方式

很多时候安装软件越来越多,部分软件产生的临时文件.垃圾文件常常存在于C盘系统盘中:日积夜累直接导致可用的系统盘空间越来越小,直到没有多余的空间为止, 最后可能的结果是系统异常.软件无法正常运行:此时可以通过其他第三方软件工具或杀毒.安全卫士之类的清理比较全面或者重新安装操作系统,不过这样也会非常麻烦, 此后还需要安装各种必要的软件.配置之类的:有时候为了方便不用安装其他软件即可清理,通过以下批处理clear.bat,可以较为方便的清理大部分垃圾或临时缓存文件, 批处理内容如下: echo "正在

hadoop2.4.1+hbase0.98.3实现的分布式网盘系统初步

直接上图片 web端用spring mvc4.0.5 hadoop+hbase 伪分布实验环境 已实现用户注册 登陆 网盘管理:上传文件 创建文件夹 修改文件及文件夹 分享文件及文件夹 删除文件及文件夹 仿百度文库浏览文档 和下载文件功能. 关注用户管理: 关注和取消关注用户 文件分享:分享列表查看 hadoop2.4.1+hbase0.98.3实现的分布式网盘系统初步,布布扣,bubuko.com