hibernate的基本查询
在Hibernate中常用的查询方式会有三种:hql,标准化条件查询,原生派sql
HQL基本查询
HQL:Hibernate uses a powerful query language . Hibernate uses a powerful query language (HQL) that is similar in appearance to SQL. Compared with SQL, however, HQL is fully object-oriented and understands notions like inheritance, polymorphism and association.(Hibernate使用一个强大的查询语言( HQL ),它在外观上的SQL相似。与SQL相比,但是, HQL是完全面向对象的理解如继承,多态和关联。)
HQL的功能:
条件查询,投影查询,分页查询,分组查询,动态绑定参数查询,内置了函数查询,连接查询,
- Hibernate的基本查询
Query接口是Hibernate中专门HQL查询的接口,query接口获取及使用方式
//默认加载hibernate.cfg.xml文件并获取Configuration的数据对象 Configuration configuration = new Configuration().configure(); //获取服务对象 StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()); ServiceRegistry build = builder.build(); //获取SessionFactory从而获取session对象 SessionFactory sessionFactory = configuration.buildSessionFactory(build); //获取session对象 session = sessionFactory.openSession(); //打开事务 transaction = session.beginTransaction(); //获取query对象 Query query = session.createQuery(hql); // 从query对象中获取数据的集合队列 List list = query.list(); //亦可以使用下面的方法代替query.list()方法获取数据对象,但是呢,使用query.list()的方法只执 //行与数据库的一次交互从而获取全部的数据对象的集合对象,而query.iterate()是存在多个返回的数//据对象时候,每一个对象都会执行一次与数据库的交互sql.提倡使用list方法,减少数据库的交互 //Iterator students = query.iterate();
查询实体对象的全部数据
//hql from
from 表名;(表名为数据持久化对象类的命名名字,必须一致,可以写全路径也可不写全路径,默认会查找全路径 )
实例:
// hql语句 数据库的表名严格按照数据持久化的命名,可以写全路径,但默认会查找全路径的持久化对象 String hql = "from Student"; // 获取hibernate的转门用于查询的接口query Query query = session.createQuery(hql); // 获取数据对象的实例,查询的数据自动封装到实体对象当中 // 在实际的开发当中建议使用query.list()的方法提取数据的全部数据对象实例集合只执行一句sql与数据库进行交互 List<Student> students = (List<Student>) query.list(); for (Student stu : students) { System.out.println(stu); } // 在从数据库中提取数据实例时候,若存在多个实例对象, // query.iterate()方法会每提取一个数据对象实例时候会执行一次sql与数据库进行交互 // Iterator students = query.iterate(); // while (students.hasNext()) { // System.out.println(students.next()); // } transaction.commit();
hql语句也可以换成下面的而形式:使用别名查询
String hql = "select stu from Student As stu ";
投影查询:即查询数据对象的部分属性/字段
方式一:select 属性1,属性2, from 表名 。
这样的投影查询是将查询到的数据对象元素保存在对象数据当中,在将数组保存在一个队列当中。
实例:
// 投影查询 String hql = "select stu.age ,stu.name from Student As stu"; Query query = session.createQuery(hql); // 一个对象查询到的属性封装在一个数组当中,按照查询的顺序存放 // 再将每个对象组成的数组保存在队列当中 List<Object[]> students = query.list(); for (Object[] student : students) { for (Object obj : student) { System.out.println(obj); } System.out.println("+++++++++"); }
方式2:实例化投影查询:select new Student(属性1,属性2) from Student
这样的投影查询是将查询的数据元素通过 new 构造方法进行封装到数据对象当中,持久化的类中必须要有相对应的构造方法。这样会比上一种投影查询会好很多!这样是查询到的字段通过构造方法封装到一个对象实例当中,再将一个对象保存到队列中去。
实例:
// 实例化投影查询 //查询的字段/元素通过相对应的构造方法封装到一个对象 实例当中 // 必须实现查询字段的构造方法 String hql = "select new Student(name,age) from Student"; //获取session对象 Query query = session.createQuery(hql); //将查询得到的数据对象保存在list队列集合当中 List<Student> students = query.list(); for (Student student : students) { System.out.println(student); }
where 条件查询:
在hql中的where条件查询也可以像sql中一样,使用各种逻辑判定符、比较运算符、范围运算符、模式运算符等。在官方文档中提供的说明:
实例:
// 条件查询 // String hql = "select new Student(name,age) from Student where name like 'jing'"; String hql = "from Student As stu where stu.name like 'jing' "; Query query = session.createQuery(hql); // 必须实现查询字段的构造方法 List<Student> students = query.list(); for (Student student : students) { System.out.println(student); }
使用函数库查询:
HQL的附带着强大的函数库:字符串相关,数字相关,集合相关,时间和日期相关
实例:
//将名字全部转为大写 String hql = "select new Student(uper(name),age) from Student where name like 'jing'"; Query query = session.createQuery(hql); // 必须实现查询字段的构造方法 List<Student> students = query.list(); for (Student student : students) { System.out.println(student); }
占位符查询:
方式1:参数位置绑定,使用问号‘?’ 占位 where 字段1=? 字段2=? ;
实例:
// 参数位置占位符 // 使用问号占位 通过query.set...方法设置相对应的数值,前一参数为第几个问号(0开始) String hql = "from Student stu where stu.age=? or stu.name=?"; Query query = session.createQuery(hql); //第一个问号设置参数int为22问号个数从0开始) query.setInteger(0, 22); //第二个问号设置参数String 为‘gaosi’ query.setString(1, "gaosi"); List<Student> students = (List<Student>) query.list(); for (Student student : students) { System.out.println(student); }
方式2:参数名字绑定,使用符占位‘:代表符’ 。where 字段1=:代表符号1 and 字段2=:代表符号2 ;
实例:
// 占位符 // 使用参数名字占位符 :代表字符 String hql = "from Student where name=:name or age=:age"; Query query = session.createQuery(hql); // 向使用age代表的字符赋值22 query.setInteger("age", 22); // 向使用name代表的字符赋值为gaosi query.setString("name", "gaosi"); List<Student> students = query.list(); for (Student student : students) { System.out.println(student); }
distinct查询
String hql = "select distinct age from Student"; Query query = session.createQuery(hql); List<Student> students = query.list(); System.out.println(students);
order by查询:对查询的记录进行排序 order by ... desc /asc. 默认为ASC 升序
实例:
//排序 降序 String hql = "select age from Student order by age desc"; Query query = session.createQuery(hql); List list = query.list();
- Hibernate的聚合函数和分组查询
在hql中的聚合函数一般有:
示例:
// avg函数 求平均值 String hql = "select avg(stu.age) from Student stu"; Query query = session.createQuery(hql); // 将求得的平均值保存在list中,类型为long型 List list = query.list(); System.out.println(list.get(0));分组查询: group by
分组过滤查询:having 。经常与group by 搭配使用
实例代码:
//统计按年龄分组且平均年龄大于22的人数 String hql = "select count(stu.age) from Student stu " + "group by stu.age having avg(stu.age)>22"; Query query = session.createQuery(hql); List list = query.list(); System.out.println(list);
- Hibernate的分页查询和批量更新
分页查询:通过query..setFirstResult(bin)设置查询的起始位置,query..setMaxResults(max);设置查询的每页的最大记录条数。实现分页查询
实例代码;
// 分页查询 String hql = "select new Student(stu.name,stu.age)" + " from Student stu"; Query query = session.createQuery(hql) //设置查询的起始位置 .setFirstResult(3) //设置查询的每页的最大记录条数 .setMaxResults(3); List<Student> students = query.list(); for (Student student : students) { System.out.println(student); }批量更新:(批量删除或修改)
int i = query.executeUpdate();// 用于批量处理数据
//当返回的值大于0则是批量处理成功
实例代码:
String hql = "delete from Student where name=:name";// 批量删除 // 批量修改 Query query = session.createQuery(hql); // List list = query.list(); query.setString("name", "zhangsan"); int i = query.executeUpdate();// 用于批量处理数据 if (i > 0) { System.out.println("成功"); } else { System.out.println("失败"); }
- Hibernate的命名查询
在Xxx.hbm.xml文件当中编写hql/sql来实现命名查询 。
编写格式:
<query name="name" > <![CDATA[ HQL/SQL语句 ]]> </query>
示例代码 Xxx.hbm.xml文件编写代码:
<!-- 命名查询 --> <query name="selectStudents"> <![CDATA[from Student]]> </query>
//命名查询 Query query = session.getNamedQuery("selectStudents"); List students = query.list(); System.out.println(students);
更为官方的文档说明以及例子:sql官方文档
相关推荐
【hibernate的HQL语句】是Hibernate框架中用于操作数据库的重要组成部分,它是一种面向对象的查询语言,类似于SQL,但更加强调对象的概念。HQL能够处理复杂的对象关系,如继承、多态和关联,使得在进行SSH(Spring、...
以上是构建SSH框架中Hibernate部分所需的基本知识。在实际项目开发中,还需要结合Spring的依赖注入和AOP特性,以及Struts的控制器和视图层管理,形成完整的SSH架构,以实现高效、模块化的Web应用开发。
5. **Criteria查询**:除了传统的HQL(Hibernate Query Language)查询,Hibernate 5还提供了Criteria API,这是一种类型安全的查询方式,可以根据对象属性动态构建查询条件。 6. **二级缓存**:Hibernate支持二级...
3. Criteria和HQL:Hibernate提供了Criteria查询和HQL(Hibernate Query Language),它们是面向对象的查询语言,比SQL更易于理解和使用,尤其是对于复杂的查询操作。 4. 第二级缓存:Hibernate支持二级缓存,可以...
在“SSH学习记录(5)-简单Hibernate”中,我们可能将深入探讨以下几点: 1. **Hibernate简介**:Hibernate作为一种开源的ORM框架,简化了Java应用与数据库之间的交互。它通过提供API和配置文件,使得开发人员能够将...
在SSH中,Hibernate处理数据库的CRUD(Create, Read, Update, Delete)操作,并通过HQL(Hibernate Query Language)或Criteria API进行查询。 4. **Hibernate Search**:文件名`hibernate-search-4.4.6.Final`表明...
- **查询语言**: Hibernate 5 提供了更强大的查询语言 HQL,方便进行复杂查询。 - **异步操作**: 引入了异步操作支持,使得开发异步应用变得更加简单。 #### 结论 《Beginning Hibernate: For Hibernate 5》是一本...
这个“hibernate基本jar包”包含了运行Hibernate应用程序所需的核心库,是学习和开发SSH(Struts、Spring、Hibernate)框架的基础。 SSH框架是Java Web开发中的一个经典组合,其中Hibernate负责数据持久化。以下是...
6. **HQL(Hibernate Query Language)**: 类似于SQL的查询语言,用于查询实体对象。 7. **第二级缓存**: 提供缓存机制,提高数据访问效率,可配置插件如Ehcache。 8. **事务管理**: Hibernate支持编程式和声明式...
在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,与Spring进行集成,可以实现声明式事务管理,并且可以借助Spring的IoC容器管理SessionFactory和Session,进一步提升应用的可维护性和灵活性。...
尽管SSH2在当前的开发环境中可能不再是最新的选择,但它所体现的设计思想和组件间的协作模式对理解和学习现代框架如Spring Boot仍有很大的帮助。理解SSH可以帮助开发者更好地掌握企业级应用的开发流程,提升解决问题...
同时,Hibernate3.1引入了Criteria查询和HQL(Hibernate Query Language),提供了更丰富的查询方式。 在SSH整合过程中,通常会使用Spring的DataSource来管理数据库连接,然后配置Hibernate的SessionFactory,最后...
5. **数据库操作**:在SSH项目中,使用Hibernate进行数据库操作时,可以利用其强大的查询语言HQL(Hibernate Query Language)或JPA的Criteria API。HQL是一种面向对象的查询语言,类似于SQL但更接近Java。Criteria ...
SSH(Struts、Spring、Hibernate)是Java Web开发中常见的三大框架,而Hibernate作为ORM(对象关系映射)框架,是连接Java应用程序与数据库的关键组件。本总结将围绕Hibernate的核心概念、配置、对象状态、关系映射...
此外,Hibernate还支持HQL(Hibernate Query Language),这是一种面向对象的查询语言,与SQL类似但更适应面向对象的编程。 在"三大框架整理笔记"中,你可能会学到以下内容: 1. **Spring配置**:包括Bean的定义、...
综上所述,SSH CRM项目中Hibernate操作数据字典的核心包括:实体类的设计、Session的使用、CRUD操作、查询方式(HQL和Criteria API)。通过熟练掌握这些知识点,开发者可以更高效地管理CRM项目中的数据字典,从而...
通过学习这个SSH项目,开发者不仅可以掌握每个框架的基本用法,还能了解如何在实际项目中整合这三个框架,实现一个完整的MVC应用。此外,代码注释和创建项目笔记对于初学者来说是非常宝贵的资源,有助于理解每一步的...
Hibernate4.3.4版本改进了查询语言HQL,提供了更强大的 Criteria 查询API,同时支持JPA2.1规范,使得与Java EE平台的集成更加顺畅。此外,还优化了缓存机制,提高了性能和数据一致性。 **Spring框架**: Spring是一...
在Hibernate3.0版本中,通过配置hibernate.cfg.xml文件,你可以定义实体类和数据库表的映射关系,使用HQL(Hibernate Query Language)进行查询。Hibernate还提供了Session接口,用于与数据库交互,实现CRUD操作。 ...
SSH框架下的分页实现主要依赖于Hibernate提供的查询功能,通过合理的设置`PageBean`类中的属性以及实现`PaginateInterface`接口中的方法,可以有效地管理分页逻辑。对于初学者而言,理解这些基本概念并实践代码是...