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的聚合函数和分组查询
// 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官方文档