我们都知道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学习---单表查询的更多相关文章

  1. Hibernate中的HQL的基本常用小例子,单表查询与多表查询

    <span style="font-size:24px;color:#3366ff;">本文章实现HQL的以下功能:</span> /** * hql语法: ...

  2. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  3. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  4. MySQL学习9 - 单表查询

    一.单表查询的语法 二.关键字的执行优先级(重点) 三.单表查询示例 1.where约束 2.group by分组查询 3.聚合函数 4.HAVING过滤 5.order by查询排序 6.limit ...

  5. day43 数据库学习 转自egon 老师博客 单表查询和多表查询

    一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...

  6. SQL学习笔记四(补充-1)之MySQL单表查询

    阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录 ...

  7. 5月10日 python学习总结 单表查询 和 多表连接查询

    一. 单表查询  一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...

  8. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  9. Hibernate学习笔记四 查询

    HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...

随机推荐

  1. Java中abstract关键字详解

    abstract只能修饰类(class) 和 方法.而不能修饰成员变量.这是由于抽象的概念确定的.只有类和方法可以抽象出来,而成员变量不需要抽象. abstract修饰类 abstract之所以出现, ...

  2. maven学习之三

    maven 创建工程: 1:直接命令:mvn archetype:generate -X -DgroupId=org.sselab -DartifactId=maven-for-mongodb  -D ...

  3. C#表达式目录树(Expression)

    1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: Expression<Func<; //表达试目录树的方 ...

  4. mysql实现高可用架构之MHA

    一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...

  5. Python 爬虫练习(一) 爬取国内代理ip

    简单的正则表达式练习,爬取代理 ip. 仅爬取前三页,用正则匹配过滤出 ip 地址和 端口,分别作为key.value 存入 validip 字典. 如果要确定代理 ip 是否真的可用,还需要再对代理 ...

  6. TFboy养成记 CNN

    1/先解释下CNN的过程: 首先对一张图片进行卷积,可以有多个卷积核,卷积过后,对每一卷积核对应一个chanel,也就是一张新的图片,图片尺寸可能会变小也可能会不变,然后对这个chanel进行一些po ...

  7. python自动发邮件库yagmail

    #### 一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from ...

  8. CSS以图换字的9种方法

    前面的话 CSS以图换字的技术,很久都没人提起了.它是一种在h1标签内,使用图像替换文本元素的技术,使页面在设计和可访问性之间达到平衡.本文将详细介绍CSS以图换字的9种方法 文字隐藏 在h1标签中, ...

  9. 虚拟机安装 deepin Linux 注意事项

    主要要注意下面几点: 一.虚拟机"客户机操作系统"类型 选择"Windows 7 x64" 选择"客户机操作系统"类型,这个选择十分重要,D ...

  10. Elasticsearch中Head插件的使用

    在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据.如果都是通过rest请求,未免太过麻烦,而且也不够人性化.此时,head可以完美的帮助你快速学习和使用El ...