分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

HQL单表查询 ---- Hibernate之查询语句

发布时间:2023-09-06 02:14责任编辑:胡小海关键词:Hibernate

叙:在hibernate框架中查询数据库的语句主要分为HQL、QBC、SQL这三种,各有各的特点,使用的情况也不尽相同,之前关于HQL查询方式的也有一些学习,但是并不全面,今天本章节轻风就HQL(Hibernate Query Language)查询语句进行了详细的学习;


HQL查询数据

本章节主要学习的是HQL查询方式的单表查询,多表查询在下一章节学习记录;

HQL介绍

HQL(Hibernate Query Language):是hibernate的数据查询方式,HQL是针对持久化对象的,它用来取得对象而不进行update、delete和insert等更新操作,是一种完全面向对象的查询方式,并且具备继承、多态和关联等特性,因此在里面的查询语句都是针对实体对象以及实体对象中的属性的,不要搞混了;

几种查询方式

1. 简单查询
此查询是hql的基本查询方式,没有任何修饰,查询所有一张表的所有数据
代码如下:

@Test ???/* ????* HQL的基本查询 ????*/ ???public void demo1() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????// String sql1 = "from com.java.domain.Customer";//全类名书写 ???????String sql = "from Customer";// 简单书写 ???????Query cust = session.createQuery(sql); ???????List<Customer> list = cust.list(); ???????for (Customer customer : list) { ???????????System.out.println(customer); ???????} ???????bt.commit(); ???????session.close(); ???}

HQL数据查询是一面向对象的形式,因此,sql=”from Customer”;这句中的Customer是实体对象的名称,而非数据库表的名表名,关于实体类名有两种书写方式,一种是全类名,即:从src到类名,这种写法是为了防止碰到相同类名的文件(一般情况下没必要这么写);第二种是直接写类名的简单书写,这种是最常用的;


2. 排序查询
排序查询和基本查询差别不大,主要是在查询的类名后边添加order by+排序依据的列名+排序方式,与sql语句的类似(asc是升序方式,desc是降序方式);

@Test ???/* ????* ?排序查询 ????*/ ???public void demo2() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????String sql = "from Customer order by cust_id desc";// asc:升序 ???desc:降序 ???????Query cust = session.createQuery(sql); ???????List<Customer> list = cust.list(); ???????for (Customer customer : list) { ???????????System.out.println(customer); ???????} ???????bt.commit(); ???????session.close(); ???}

3. 条件查询
与sql语句类似,where后边加上根据哪个列进行条件查询,并通过占位符来进行查询;
占位符存在两种,一种是直接用问号,第二种是起代号,注意,起代号的方式需要在代号前加冒号;两种操作如下所示:

@Test ???/* ????* 条件查询 ????*/ ???public void demo3() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????//String sql = "from Customer where cust_id=?";//通过问占位 ???????String sql1 = "from Customer where cust_id=:id ";//通过“代号”占位 ???????Query cust = session.createQuery(sql1); ???????//cust.setParameter(0, 2l);//通过问号占位的从0开始排序 ???????cust.setParameter("id", 2l); ???????List list = cust.list(); ???????System.out.println(list); ???????bt.commit(); ???????session.close(); ???}

问号占位符需要在setparameter中从0开始排序,
代号占位符需要在setparameter中先写代号,再写条件查询的条件值;


4. 分页查询
分页查询只需要两个关键字,setFirstResults()和setMaxresults(),第一个是起始索引值,第二个每页最大显示数据条数; (起始索引值 = (当前页数-1)* 每页显示条数)

@Test ???/* ????* 分页查询 ????*/ ???public void demo4() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????String sql = "from Customer"; ???????Query cust = session.createQuery(sql); ???????//limit ?,? ???索引起始 = (当前页数-1)* 每页要显示的数据条数 ???????cust.setFirstResult(2);//起始索引 ???????cust.setMaxResults(2);//每页显示条数 ???????List<Customer> list = cust.list(); ???????for (Customer customer : list) { ???????????System.out.println(customer); ???????} ???????bt.commit(); ???????session.close(); ???}

5. 统计查询
统计查询重点在于关键字,这个关键字和排序查询一样,都在查询语句中,和分页查询的关键字不一样,分页查询的关键字是在代码中,不是在查询语句中;
主要的几个关键字:

  • count 统计
  • sum ?求和
  • avg ??平均数
  • max(min)最大值(最小值)

代码:

@Test ???/* ?????*统计查询 ????*/ ???public void demo5() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????String sql_count = "select count(*) from Customer"; ???????String sql_sum = "select sum(cust_id) from Customer"; ???????String sql_avg = "select avg(cust_id) from Customer";//获得的是double类型的返回值 ???????String sql_max = "select max(cust_id) from Customer"; ???????String sql_min = "select min(cust_id) from Customer"; ???????Query cust = session.createQuery(sql_avg); ???????Number uniqueResult = (Number) cust.uniqueResult(); ???????System.out.println(uniqueResult); ???????bt.commit(); ???????session.close(); ???}

在关键字后的括号内填入根据实体对象的那个属性进行统计查询,不是根据数据库表的列名
接收转化的关键字需要注意,使用uniqueresult方法进行接收,Number类进行存放,Number类型的是封装的接收类,里面封装了各种数据类型的接收方法,直接使用就OK了。


6. 投影查询
投影查询就是查询一个表中某几个自己需要的字段数据,这个查询的好处就是能够简明快速的查询到自己想要的数据,不会浪费内存等资源;
在返回值方面需要注意,返回值是一个list类型的;

@Test ???/* ????* 投影查询 ????* ?????*/ ???public void demo6() { ???????Session session = HibernateUtils.openSession(); ???????Transaction bt = session.beginTransaction(); ???????String sql1 = "select cust_name from Customer"; ???????String sql2 = "select cust_id,cust_name from Customer";//这种显示效果不佳,一般不使用 ???????String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在对应的Customer实体类中构造方法,创建无参构造 ???????Query cust = session.createQuery(sql3); ???????List list = cust.list(); ???????System.out.println(list); ???????bt.commit(); ???????session.close(); ???}

查询单个字段属性时,直接将表中字段名对应的实体类的属性名写上即可,如果是查询多个而非表中所有时,直接以:
Select new 对象名(属性名1,属性名2,…) from 类名;
注意:此中的对象名的对象是需要在实体类名的类中进行构造的,并且要类中有对应的无参构造,以上面的sql3的查询语句为例,其在Customer类中的对象的构造以及无参构造如下所示:
这个例子中主查询类是Customer,所以其返回值的范型是Customer,运行的结果如下图所示:

从中可以看出,数据变成了一条一条的被放在以一个数据集合中;


pass:本章及学习记录了HQL查询方式的单表查询方式,下章才会把学习的HQL的多表查询方式上传上来,有需要的可以看看下一章
pass:pass:笔记是根据个人理解写出来的,有可能有理解不到位的地方,希望各位发现后可以告诉我,相互进步~


《本章完》

HQL单表查询 ---- Hibernate之查询语句

原文地址:https://www.cnblogs.com/Email-qtl777777/p/9651933.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved