Hibernate学习---单表查询
我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以Hibernate也是能够实现SQL的一切数据库操作。
在SQL中,单表查询是最常用的语句,同理Hibernate最常用到的也是查询语句,所以今天就来讲讲Hibernate的单表查询:
今天要将的内容分以下几点:
- 查询所有
- 查询结果排序
- 为查询参数动态赋值
- 分页查询
- 模糊查询
- 唯一性查询
- 聚合函数查询
- 投影查询
- 分组查询
- 单表查询的迭代
- 命名查询
Hibernate不仅为我们提供了它本身的查询语句HQL,同时也还提供了SQL和criteria标准查询,接下来我们都会来一一实验。
废话不多说,直接上代码:
查询所有:
SQL:
String sql = "select * from t_student";
List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();
for(Student student:list) {
System.out.println(student);
}
//sql语句和我们原生的sql语句一样,查询后的
//createSQLQuery(sql)这个返回的是一个sql语句,通过查询获得的是一个结果集(Set),然后Hibernate通过addEntity进行封装,返回一个list集合,里面装着封装好的Student对象。
HQL:
String hql = "from Student";//这里放的是Student类,因为HQL查询时面向对象的。
List <Student>list = session.createQuery(hql).list();//正因为查询是面向对象的,所以不需要封装。
for(Student student:list) {
System.out.println(student);
}
QBC(Query By Criteria):
List <Student>list = session.createCriteria(Student.class).list();
for(Student student:list) {
System.out.println(student);
}
//它也是面向对象查询,只需要将Student Class对象最为参数就行,连语句都不需要0.0
查询结果排序:
SQL:
String sql = "select * from t_student order by t_age desc";
//降序,升序为asc
List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();
HQL:
String hql = "from Student order by age desc";
List <Student>list = session.createQuery(hql).list();
QBC:
List <Student>list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list();
//session.createCriteria(Student.class).addOrder(Order.asc("age")).list();
//QBC的特殊查询,每个查询都会对应方法
为查询参数动态赋值:
接下来我们只验证HQL语句,因为SQL语句和我们学过的都一样,之前只是演示了它在Hibernate中的用法。
在JDBC中我们可以使用预处理语句来提高效率,并且可以用来防止SQL注入攻击,Hibernate同样可以完成类似的操作:
//方法一:
String hql = "from Student where age>?";
List <Student>list = session.createQuery(hql).setInteger(0, 25).list();
//setInteger(0, 25)位置从0开始,JDBC是从1开始
//方法二:
String hql = "from Student where age>:age";//以冒号开头起别名
List <Student>list = session.createQuery(hql).setInteger("age", 25).list();
//方法三:
String hql = "from Student where age>?";
List <Student>list = session.createQuery(hql).setParameter(0, 25).list();
//这里设置参数要注意数据类型,如果类中字段定义的是Double类型,那么setParameter(0, 25)参数25应该为写为25.0
分页查询:
在SQL中分页查询时非常重要的了,在Hibernate中也同样是。
在传统的SQL语句中分页查询的语句为:
select*from table limit startIndex,pageSize;
HIbernate里面的分页不是通过语句来实现的,而是通过方法对session操作来实现的:
int page = 2;//前台需要分页的时候一般会向后台提交页数
int pageSize = 3;//由前台传回需要每页几条数据
int firstResult = (page-1)*pageSize;//结果集是从零开始
List <Student>list = session.createQuery(hql) .setFirstResult(firstResult) .setMaxResults(pageSize)
.list();
//这样就完成了我们的分页
模糊查询:
同样Hibernate也提供了模糊查询:
//方法一:
String hql = "from Student where name like '%张%'";
List <Student>list = session.createQuery(hql)
.list();
//方法二:
String hql = "from Student where name like ?";
List <Student>list = session.createQuery(hql)
.setString(0, "%张%")
.list();
//方法三:
String hql = "from Student where name like:name";
List <Student>list = session.createQuery(hql)
.setString("name", "%张%")
.list();
唯一性查询:
String hql = "from Student where id=:id";
Student student = (Student)session.createQuery(hql)
.setInteger("id", 1)
.uniqueResult();
//之前我们得到的都是list集合,通过.uniqueResult();可以得到单个结果集,也就是封装好的单个对象。
聚合函数查询:
String hql = "select count(*) from Student ";
Long count = (Long)session.createQuery(hql)
.uniqueResult();
//聚合函数count查询出来的数是long数据类型,也是uniqueResult
投影查询:
投影查询也就是查询部分字段。如:id,name,age,score
我们只需要查询name,age,就叫做投影查询。
String hql = "select new Student(name,age) from Student ";
List<Student> list = session.createQuery(hql)
.list();
//因为hql语句是面向对象的查询,所以投影查询需要new一个含有所投影字段的对象(同时要在实体类中添加对应是构造函数)
分组查询:
String hql = "select age from Student group by age having count(age)>4 ";
List<Integer> list = session.createQuery(hql)
.list();
//对于查询单个的字段,因为有数据类型与它对应,所以不需要新建对象,可以直接查询。 HQL分组查询和SQl查询方法基本一致
Query接口的iterator
iterator(迭代器)首先会从session缓存中查询我们需要的内容,如果没有我们需要的内容,然后去数据库用sql语句查询。
多次查询相同的内容我们可以用到Hibernate的缓存特性(session),可以加快查询的效率。
传统的我们用HQL查询的时候,每次都需要去数据库中查询,这样如果查询同样的内容就会造成数据库服务器负载过重(例如新闻主页,就会多次查询相同内容),当第一次查询过后session没有clear或者close之前我们已经查询过的内容都会在session中缓存,所以当第二次查询的时候我们就可以使用迭代器了。
我们知道从session中读取数据远远比从数据库中读取数据要快。
但是,迭代器对于没有查询过的内容(也就是session缓存中没有要查询的数据的时候),效率会特别低,所以我们建议对于同样查询,第一次使用list查询,第二次及以后使用iterator迭代。
命名查询:
我们也可以将经常用到的查询语句在我们Hibernate主配置文件中配置好。
<!--注意,query标签是<hibernate-mapping>的子标签-->
<query name="queryById">from Student where id=:id</query>
//使用getNamedQuery方法来获得配置文件中的查询语句。
Student student = (Student)session.getNamedQuery("queryById") .setInteger("id", 1)
.uniqueResult();
到这里我们就将Hibernate的基本单表查询学的差不多了,当然肯定还有没学到(我这里只列举了我们经常使用到的一些操作)。
写的不好,望指正。
Hibernate学习---单表查询的更多相关文章
- Hibernate中的HQL的基本常用小例子,单表查询与多表查询
<span style="font-size:24px;color:#3366ff;">本文章实现HQL的以下功能:</span> /** * hql语法: ...
- 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)
一. mybatis的高级映射 1 单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...
- SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数
Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下: ...
- MySQL学习9 - 单表查询
一.单表查询的语法 二.关键字的执行优先级(重点) 三.单表查询示例 1.where约束 2.group by分组查询 3.聚合函数 4.HAVING过滤 5.order by查询排序 6.limit ...
- day43 数据库学习 转自egon 老师博客 单表查询和多表查询
一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...
- SQL学习笔记四(补充-1)之MySQL单表查询
阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录 ...
- 5月10日 python学习总结 单表查询 和 多表连接查询
一. 单表查询 一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- Hibernate学习笔记四 查询
HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...
随机推荐
- 从cdn说起
为什么要使用cdn 雅虎军规有一条规则建议我们是用cdn.随便在网上搜索,可以找到使用的cdn的好处. 再次强调第一条黄金定律,减少网页内容的下载时间.提高下载速度还可以通过CDN(内容分发网络)来提 ...
- Nuxt框架实践
前言 今天抽空过了遍nuxt文档,写了个实践demo,关于nuxt我已经断断续续看了好几遍了,自我感觉也算是入门了吧,从开发到上线心里都有底.后期打算在项目用起来的是nuxt框架,一些函数工具库,比如 ...
- 自动化运维工具——ansible详解(一)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...
- Makefile中的变量和shell变量
我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...
- c语言的发展历程
C语言的发展颇为有趣.它的原型ALGOL 60语言. 1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言. 1967年,剑桥大学 ...
- 【luogu1220】关路灯
https://www.luogu.org/problem/show?pid=1220 假如当前老张在a处跑去关掉b处的路灯,那么a与b之间的路灯都可以顺手关掉.因此每一时刻关掉的路灯必定是连续的. ...
- JAVA9模块化详解(一)——模块化的定义
JAVA9模块化详解 前言 java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性--模块化.模块化系统的主要目的如下: 更可靠的配置,通过制定明确的类的依赖关系代替以前那种易错的 ...
- 联动加入redmine的wik
<? php error_reporting(E_ERROR); date_default_timezone_set('Asia/Shanghai'); $red_server = " ...
- 解决 PclZip 中文乱码问题
在使用 Pclzip 时出现无法压缩/解压文件的现象,追踪错误信息发现无法打开文件/文件夹.可是文件夹权限正确,打印文件路径之后发现是乱码. 出现这个问题的解决办法是windows下zip内的 ...
- Oracle ROWID具体解释
1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包括下面信息: 对象的数据对象编号 该行所在的数据文件里的数据块 该行中数据块 ...