Hibernate学习笔记 查询简介

2023-11-02

创建实体类

在介绍Hibernate查询语言之前,首先我们来建立一下数据库。这里直接使用了MySQL自带的样例数据库world。如果你没有安装MySQL那么需要安装一下,并且在安装的时候选择安装样例数据库。

安装完成之后,应该能在MySQL中看到一个名为world的数据库,其中有三个表,country、city以及countrylanguage表。然后我们来建立这三个表对应的实体类。需要注意,由于这一次是针对已经存在的数据库,所以在hibernate.cfg.xml<property name="hbm2ddl.auto">update</property>这一行应当设置为update,避免Hibernate重新创建表覆盖掉原有的数据。

这三个表有点长,所以会影响到阅读。由于countrylanguage表存在两个主键,而且Hibernate要求复合主键的实体类必须实现Serializable接口,所以这里也实现了这个接口。


@Entity
public class City {
    private int id;
    private Country country;
    private String district;
    private String name;
    private Integer population;

    @Id
    @Column(name = "ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name = "CountryCode", foreignKey = @ForeignKey(name = "countryLanguage_ibfk_1"))
    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    @Basic
    @Column(name = "District")
    public String getDistrict() {
        return district;
    }

    public void setDistrict(String district) {
        this.district = district;
    }

    @Basic
    @Column(name = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "Population")
    public Integer getPopulation() {
        return population;
    }

    public void setPopulation(Integer population) {
        this.population = population;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        City city = (City) o;
        return id == city.id &&
                Objects.equals(country, city.country) &&
                Objects.equals(district, city.district) &&
                Objects.equals(name, city.name) &&
                Objects.equals(population, city.population);
    }

    @Override
    public String toString() {
        return "City{" +
                "id=" + id +
                ", country=" + country.getName() +
                ", district='" + district + '\'' +
                ", name='" + name + '\'' +
                ", population=" + population +
                '}';
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, country, district, name, population);
    }
}



@Entity
public class Country {
    private String code;
    private String name;
    private String continent;
    private String region;
    private double surfaceArea;
    private Short indepYear;
    private int population;
    private Double lifeExpectancy;
    private Double gnp;
    private Double gnpOld;
    private String localName;
    private String governmentForm;
    private String headOfState;
    private Integer capital;
    private String code2;

    @Id
    @Column(name = "Code")
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Basic
    @Column(name = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "Continent")
    public String getContinent() {
        return continent;
    }

    public void setContinent(String continent) {
        this.continent = continent;
    }

    @Basic
    @Column(name = "Region")
    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    @Basic
    @Column(name = "SurfaceArea")
    public double getSurfaceArea() {
        return surfaceArea;
    }

    public void setSurfaceArea(double surfaceArea) {
        this.surfaceArea = surfaceArea;
    }

    @Basic
    @Column(name = "IndepYear")
    public Short getIndepYear() {
        return indepYear;
    }

    public void setIndepYear(Short indepYear) {
        this.indepYear = indepYear;
    }

    @Basic
    @Column(name = "Population")
    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }

    @Basic
    @Column(name = "LifeExpectancy")
    public Double getLifeExpectancy() {
        return lifeExpectancy;
    }

    public void setLifeExpectancy(Double lifeExpectancy) {
        this.lifeExpectancy = lifeExpectancy;
    }

    @Basic
    @Column(name = "GNP")
    public Double getGnp() {
        return gnp;
    }

    public void setGnp(Double gnp) {
        this.gnp = gnp;
    }

    @Basic
    @Column(name = "GNPOld")
    public Double getGnpOld() {
        return gnpOld;
    }

    public void setGnpOld(Double gnpOld) {
        this.gnpOld = gnpOld;
    }

    @Basic
    @Column(name = "LocalName")
    public String getLocalName() {
        return localName;
    }

    public void setLocalName(String localName) {
        this.localName = localName;
    }

    @Basic
    @Column(name = "GovernmentForm")
    public String getGovernmentForm() {
        return governmentForm;
    }

    public void setGovernmentForm(String governmentForm) {
        this.governmentForm = governmentForm;
    }

    @Basic
    @Column(name = "HeadOfState")
    public String getHeadOfState() {
        return headOfState;
    }

    public void setHeadOfState(String headOfState) {
        this.headOfState = headOfState;
    }

    @Basic
    @Column(name = "Capital")
    public Integer getCapital() {
        return capital;
    }

    public void setCapital(Integer capital) {
        this.capital = capital;
    }

    @Basic
    @Column(name = "Code2")
    public String getCode2() {
        return code2;
    }

    public void setCode2(String code2) {
        this.code2 = code2;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Country country = (Country) o;
        return Double.compare(country.surfaceArea, surfaceArea) == 0 &&
                population == country.population &&
                Objects.equals(code, country.code) &&
                Objects.equals(name, country.name) &&
                Objects.equals(continent, country.continent) &&
                Objects.equals(region, country.region) &&
                Objects.equals(indepYear, country.indepYear) &&
                Objects.equals(lifeExpectancy, country.lifeExpectancy) &&
                Objects.equals(gnp, country.gnp) &&
                Objects.equals(gnpOld, country.gnpOld) &&
                Objects.equals(localName, country.localName) &&
                Objects.equals(governmentForm, country.governmentForm) &&
                Objects.equals(headOfState, country.headOfState) &&
                Objects.equals(capital, country.capital) &&
                Objects.equals(code2, country.code2);
    }

    @Override
    public int hashCode() {
        return Objects.hash(code, name, continent, region, surfaceArea, indepYear, population, lifeExpectancy, gnp, gnpOld, localName, governmentForm, headOfState, capital, code2);
    }

    @Override
    public String toString() {
        return "Country{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", continent='" + continent + '\'' +
                ", region='" + region + '\'' +
                ", surfaceArea=" + surfaceArea +
                ", indepYear=" + indepYear +
                ", population=" + population +
                ", lifeExpectancy=" + lifeExpectancy +
                ", gnp=" + gnp +
                ", gnpOld=" + gnpOld +
                ", localName='" + localName + '\'' +
                ", governmentForm='" + governmentForm + '\'' +
                ", headOfState='" + headOfState + '\'' +
                ", capital=" + capital +
                ", code2='" + code2 + '\'' +
                '}';
    }
}



@Entity
public class Countrylanguage implements Serializable {
    private String language;
    private Country country;
    private String isOfficial;
    private Double percentage;

    @Id
    @Column(name = "Language")
    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    @Id
    @ManyToOne
    @JoinColumn(name = "CountryCode", foreignKey = @ForeignKey(name = "countryLanguage_ibfk_1"))
    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    @Basic
    @Column(name = "IsOfficial")
    public String getIsOfficial() {
        return isOfficial;
    }

    public void setIsOfficial(String isOfficial) {
        this.isOfficial = isOfficial;
    }

    @Basic
    @Column(name = "Percentage")
    public Double getPercentage() {
        return percentage;
    }

    public void setPercentage(Double percentage) {
        this.percentage = percentage;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Countrylanguage that = (Countrylanguage) o;
        return Objects.equals(language, that.language) &&
                Objects.equals(country, that.country) &&
                Objects.equals(isOfficial, that.isOfficial) &&
                Objects.equals(percentage, that.percentage);
    }

    @Override
    public String toString() {
        return "Countrylanguage{" +
                "language='" + language + '\'' +
                ", country=" + country.getName() +
                ", isOfficial='" + isOfficial + '\'' +
                ", percentage=" + percentage +
                '}';
    }

    @Override
    public int hashCode() {
        return Objects.hash(language, country, isOfficial, percentage);
    }
}

HQL

HQL是Hibernate的数据库查询语言,看名字可以知道这种查询语言和SQL类似。其实呢,这种查询语言,其实就是SQL中把表名和列名换成了实体类名和属性名。而且如果使用IDEA这样的智能集成开发环境,还会贴心的把SQL和HQL等查询语言高亮显示,特别方便。

首先我们需要创建一个Session,然后使用session.createQuery方法创建一个Query对象,然后调用query.list方法获取查询结果。这是一个简单的例子,演示了一下HQL的基本用法。如果需要更详细的用法还是查阅相关资料更好。

    @Test
    public void test() {
        try (Session session = factory.openSession()) {
            //查询所有国家
            List<Country> countries = session.createQuery("from Country", Country.class).list();
            //查询c开头的所有国家
            List<Country> countriesStartWithC = session.createQuery("from Country c where c.name like 'c%'", Country.class).list();
            //countries.forEach(country -> logger.info(country.toString()));
            countriesStartWithC.forEach(country -> logger.info(country.toString()));
            //查询中国的国家代码
            List<String> countryCodes = session.createQuery("select c.code from Country c where c.name='China'", String.class).list();
            countryCodes.forEach(c -> logger.info(c));
            //查询中国的所有城市
            List<City> cities = session.createQuery("from City c where c.country.name='China'", City.class).list();
            cities.forEach(c -> logger.info(c.toString()));
        }

    }

Criteria

Criteria是Hibernate提供的另外一种查询语言。Criteria有两个版本,org.hibernate.Criteria属于旧版本的,虽然还没有标记为过时,Hibernate官方已经不推荐我们使用这种了。相应的,我们应该使用javax.persistence.criteria.CriteriaBuilder接口来创建和使用查询。

首先需要调用getCriteriaBuilder方法生成一个CriteriaBuilder。然后使用Builder的createQuery方法创建一个查询。Root对象代表查询的根,也就是要查询的表,然后可以使用查询对象提供的各种方法来查询我们要的数据。详细的使用方法还是需要查阅文档。

    @Test
    public void testCriteria() {
        try (Session session = factory.openSession()) {
            //查询人口最少的20个城市
            CriteriaBuilder builder = session.getCriteriaBuilder();
            CriteriaQuery<City> query = builder.createQuery(City.class);
            Root<City> root = query.from(City.class);
            query.select(root);
            query.orderBy(builder.asc(root.get("population")));
            List<City> cities = session.createQuery(query).setMaxResults(20).list();
            cities.forEach(city -> logger.info(city.toString()));
        }
    }

Native SQL

除了使用上面所说的查询语言之外,还可以直接使用SQL查询数据。调用Session.createNativeQuery即可创建一个SQL查询。需要注意返回的结果是一个List

    @Test
    public void testSQL() {
        try (Session session = factory.openSession()) {
            //东亚所有国家和地区
            NativeQuery query = session.createNativeQuery("select code,name,population from country where Region='Eastern Asia'");
            List<Object[]> countries = query.getResultList();
            for (Object[] country : countries) {
                String code = (String) country[0];
                String name = (String) country[1];
                int population = (int) country[2];
                logger.info("Code:{} Name:{} Population:{}", code, name, population);
            }
        }
    }

以上就是Hibernate提供的几种查询方式。我这里只做了一点简单介绍,详细的使用方法还是需要查看更详细的资料。不过这些方法基本大同小异,只要熟悉SQL数据库的查询语言,学会这几种查询方法也很简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate学习笔记 查询简介 的相关文章

随机推荐

  • Python基础:按位异或 ^ ,按位或

    前言 文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http t cn A6Zvjdun 使用按位异或
  • JDK8 JVM参数与实际环境中的优化配置实践

    如何配置我们的JVM呢 首先我们需要知道JVM的参数有哪些 然后根据这些参数的意义去分析自己的程序的JVM需要的配置 可以事先做一些尝试 再逐步调优 这个调优也是一个过程 没有足够的经验而做到一步到位是一件很困难的事情 事情是一点点做的 不
  • 关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法

    一 内存的思考题 请问运行Test函数会有什么样的结果 第一题 void GetMemory char p p char malloc 100 void Test void char str NULL GetMemory str strcp
  • Node.js到底是个啥?干什么用的?优缺点是什么?

    Nodejs简介 Node js是一个Javascript运行环境 runtime 是一个可以快速构建网络服务及应用的平台 是用Javascript语言构建的服务平台 可用于后端建立服务器 Node js与Javascript的区别 nod
  • error: cannot call member function ‘void me::sendMessage()‘ without object

    error cannot call member function void me sendMessage without object 原因分析 解决方案 原因分析 在connect中 传递函数地址不用带括号 参考函数指针的赋值 incl
  • 将tensorflow模型部署到服务器上

    基本思路 利用tensorflow官方提供的tensorflow serving进行部署 同时 为了免去环境配置等麻烦操作 可借助docker容器 一 服务器环境选择 首先肯定要去租一个服务器 例如阿里云 一开始选了window serve
  • C++ 如何调用 通过Boost.python 封装的python函数(安装与配置注意事项)

    一 下载好相匹配的版本python与boost 1 建议使用新版的比较方便 也没有太多的bug 2 我使用的Boost 库是1 82 0 点击下载 Boost 1 82 0 3 使用的是python 3 10 11版本 点击下载 pytho
  • 【代码扫描修复】绝对路径遍历(高危)

    漏洞描述 摘要 允许用户输入控制文件系统操作所用的路径会导致攻击者能够访问或修改其他受保护的系统资源 缺陷描述 当满足以下两个条件时 就会产生路径遍历错误 攻击者可以指定某一文件系统操作中所使用的路径 攻击者可以通过指定特定资源来获取某种权
  • SpringMVC架构浅析

    SpringMVC概述 Spring的web框架围绕DispatcherServlet设计 DispatcherServlet的作用是将请求分发到不同的处理器 Spring的web框架包括可配置的处理器 handler 映射 视图 view
  • 服装销售管理系统---课程设计(C/C++简易版)

    目录 基于大一学期对C C 的学习做的一个关于实现一个服装销售管理系统的课程设计 强化自己关于面向对象 OOP 编程思想 耗时4 5天左右 功能大抵实现 流程图 源代码 总结 基于大一学期对C C 的学习做的一个关于实现一个服装销售管理系统
  • 腾讯安全技术类面试

    初试 2014 09 23 被分配到 安全技术类 在海航威斯汀酒店 五楼签到 面试房间2009 时间14 30 因为没有把握 反正要被刷掉的 于是我随便穿了一件红色的短衬衫和黑色的小短裤就去了 发现好冷 面试的时候又很饿 那个房间关门了 按
  • STM32F103芯片的基本硬件设计:下载、复位、启动设置、晶振

    1 下载口 一般情况下我们都是用SWD方式下载 一般有两种接线方式 一种4线 VCC GND SWDIO接10K上拉 SWCLK接10K下拉 一种是5线的 在4线的基础上增加了一个NRST上拉10K 但其实没必要 因为NRST是复位脚 电路
  • 变态青蛙跳台阶的两种典型分析方法

    变态青蛙跳台阶的两种典型分析方法 最近看到递归相关的算法 有个变态青蛙跳台阶的延伸问题还蛮有趣的 题目如下 拿出来分析一下 一只青蛙一次可以跳上1级台阶 也可以跳上2级 它也可以跳上n级 求该青蛙跳上一个n级的台阶总共有多少种跳法 方法一
  • python爬虫招聘网站(智联)

    2021年10月7日爬取 爬虫代码不知道是否失效 文章目录 爬虫目标 具体过程 源码 爬虫目标 要求 搜索 大数据 专业 爬相关公司的招聘信息 列数不少于10列 行数不少于3000 目标 搜索 大数据 爬取智联招聘 北京上海广州深圳天津武汉
  • maven查看jar的pom引入来源

    从idea中点击 Maven Projects 后点击Show Dependencies 如图所示 得到依赖关系图 如下 在页面进行 Ctrl F 搜索需要的 Jar 名称 例 查找 spring beans 双击框定的地方 就能进入到对应
  • 一分钟快速利用ChatGPT生成PPT

    目标 让AI给我们生成一篇PPT报告 首先介绍一下什么是ChatGPT ChatGPT是一种基于自然语言处理技术的人工智能应用 它使用OpenAI的GPT模型来自动生成自然语言的回复 可以作为虚拟助手 客服机器人等方面的应用 与其他机器学习
  • SOC芯片中VIP和IP之间的路由关系

    通用PAD是双向端口 inout 这就意味着每个通用PAD可以根据需要被配置成输入或输出 如图1所示 图1 ind是输入端口 do是输出端口 obe是输出使能信号 当obe为低电平时 PAD作为输入端口使用 三态门关闭 do高阻 片外数据通
  • nm 命令显示

    用途 显示关于对象文件 可执行文件以及对象文件库里的符号信息 语法 nm A C X 32 64 32 64 f h l p r T v B P e g u d o x t Format File 描述 nm 命令显示关于指定 File 中
  • FISCO BCOS工程师常用的性能分析工具推荐

    FISCO BCOS是完全开源的联盟区块链底层技术平台 由金融区块链合作联盟 深圳 简称金链盟 成立开源工作组通力打造 开源工作组成员包括博彦科技 华为 深证通 神州数码 四方精创 腾讯 微众银行 亦笔科技和越秀金科等金链盟成员机构 代码仓
  • Hibernate学习笔记 查询简介

    创建实体类 在介绍Hibernate查询语言之前 首先我们来建立一下数据库 这里直接使用了MySQL自带的样例数据库world 如果你没有安装MySQL那么需要安装一下 并且在安装的时候选择安装样例数据库 安装完成之后 应该能在MySQL中