Hibernate的HQL简单查询语句

2024-08-26 07:32

本文主要是介绍Hibernate的HQL简单查询语句,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

 

    不管数据库用的是什么类型,对于查询语句来说,我们总是习惯了SQL语句。它之所以能够屹立不倒,一方面已成为了习惯,一方面确实功能强大。Hibernate相对于其他ORM实现来说,数据查询是它独特的亮点。它所提供的HQL,类似于SQL语句,但是却比SQL语句灵活。它跟SQL语句有很多相似的地方,是因为这样的话更容易被接受。

 

HQL查询

 

简单属性查询

 

    简单属性就是一个实体本身的属性,不包括它和其他实体的关联属性。在查询简单属性时,HQL语句和SQL语句类似,可以查询一个字段,也可以查询多个字段。因为Hibernate是面向对象操作的,所以也就是可以查询单一属性,也可以查询多个属性。

 

    1、单一属性查询

 

 

List students = session.createQuery("select name from Student").list();

 

    

    单一属性查询,查询实体对象的某一个属性,返回的结果集是实体属性的集合,集合的元素类型和实体的属性类型一致。取值时如下操作:

 

 

for (Iterator iter=students.iterator(); iter.hasNext();) {String name = (String)iter.next();System.out.println(name);
}

 

 

    2、多个属性查询

 

 

List students = session.createQuery("select id, name from Student").list();

 

    多个属性查询是同时查询实体的多个属性,返回的是对象数组的集合,数组元素的类型和实体属性类型一致,数组的长度和查询属性的个数一致。取值时如下操作:

 

 

for (Iterator iter=students.iterator(); iter.hasNext();) {Object[] obj = (Object[])iter.next();System.out.println(obj[0] + ", " + obj[1]);
}

 

    多个属性查询时,也可以返回实体集合,只需要对HQL语句稍加改动即可:

 

 

List students = session.createQuery("select new Student(id, name) from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getId() + ", " + student.getName());
}

 

    3、使用别名

 

 

    在SQL语句中,经常用到连接的SQL语句用别名比较方便,在HQL语句中同样也可以用别名,和不用别名的查询效果是一样的。

 

 

List students = session.createQuery("select s.id, s.name from Student s").list();

 

实体对象查询

 

    实体对象查询时,相当于查询整张表的数据,返回实体对象集合,这个和SQL语句结合起来很容易理解。关键就在于,使用实体对象查询时,是采用的list方法,还是iterate方法,这两个方法有很大的区别。

 

    使用list方法时,Hibernate会发出一条SQL语句,查询该实体对应表的所有数据。但是使用iterate方法时,Hibernate会首先发出一条查询所有id的SQL语句,然后用每一个id为条件查询单个数据,这是就会发出N+1条SQL语句。

 

 

/*** 采用list查询实体对象会发出一条查询语句,取得实体对象数据* * Hibernate: select student0_.id as id0_, student0_.name as name0_, * student0_.createTime as createTime0_, student0_.classesid as classesid0_ * from t_student student0_*/
List students = session.createQuery("from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());
}
/*** 会出现N+1问题,所谓的N+1指的是发出了N+1条sql语句* * 1:发出一条查询id列表的语句* Hibernate: select student0_.id as col_0_0_ from t_student student0_* * N:根据id发出N条sql语句,加载相关的对象* Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, * student0_.createTime as createTime0_0_, student0_.classesid as classesid0_0_ * from t_student student0_ where student0_.id=?* */
Iterator iter = session.createQuery("from Student").iterate();
while (iter.hasNext()) {Student student = (Student)iter.next();System.out.println(student.getName());
}

    

 

    解决N+1问题,可以采用Hibernate的缓存,先使用list方法将数据查询出来,然后数据会自动被放到一级缓存中,再用iterate方法查询时,会直接从缓存中查询,就不会发出SQL语句了,其实就是曲线救国。

 

条件查询

 

    用条件查询时,查询条件可以采用拼接字符串的形式,也可以用?来代替,同样也可以传递一个参数集合。同样,在HQL语句中,也可以使用数据库函数。

 

 

//拼接字符串
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%0%'").list();
//可以使用?方式传递参数
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%0%").list();
//可以采用 :参数名 的方式传递参数
List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname").setParameter("myname",  "%0%").list();
//采用 ?方式,查询学号为1,2,3,4,5的学生
List students = session.createQuery("select s.id, s.name from Student s where s.id in(?, ?, ?, ?, ?)").setParameter(0, 1).setParameter(1, 2).setParameter(2, 3).setParameter(3, 4).setParameter(4, 5).list();
//查询2009-08的学生,可以调用mysql的日期格式化函数
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0,  "2009-08").list();

 

 

插入SQL语句

 

    HQL语句不光自己可以查询,也可以直接用插入SQL语句查询,利用SQL语句中的函数进行查询。

 

 

String hql = "select c.name, count(s) from Classes c join c.students s group by c.name order by c.name";
List students = session.createQuery(hql).list();

 

 

总结

 

    HQL语句的关键字不区分大小写,不过习惯上都是用的小写。因为Hibernate是面向对象的,所以HQL语句中,查询时并不使用数据库表名,而是使用实体类名,所以上面看到的HQL语句中,Student一定要跟实体类名相同,这样通过映射文件配置的实体类和表的映射,才可以找到数据库中的表。通常习惯使用SQL语句后,那么和它规则类似的查询语句也比较容易接受,这也是为什么HQL语句比SQL语句灵活,但是却跟SQL语句很相似的原因。

这篇关于Hibernate的HQL简单查询语句的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107935

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec