HQL单表查询 ---- Hibernate之查询语句
叙:在hibernate框架中查询数据库的语句主要分为HQL、QBC、SQL这三种,各有各的特点,使用的情况也不尽相同,之前关于HQL查询方式的也有一些学习,但是并不全面,今天本章节轻风就HQL(Hibernate Query Language)查询语句进行了详细的学习;
HQL查询数据
本章节主要学习的是HQL查询方式的单表查询,多表查询在下一章节学习记录;
HQL介绍
HQL(Hibernate Query Language):是hibernate的数据查询方式,HQL是针对持久化对象的,它用来取得对象而不进行update、delete和insert等更新操作,是一种完全面向对象的查询方式,并且具备继承、多态和关联等特性,因此在里面的查询语句都是针对实体对象以及实体对象中的属性的,不要搞混了;
几种查询方式
1. 简单查询
此查询是hql的基本查询方式,没有任何修饰,查询所有一张表的所有数据
代码如下:
@Test /* * HQL的基本查询 */ public void demo1() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); // String sql1 = "from com.java.domain.Customer";//全类名书写 String sql = "from Customer";// 简单书写 Query cust = session.createQuery(sql); List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
HQL数据查询是一面向对象的形式,因此,sql=”from Customer”;这句中的Customer是实体对象的名称,而非数据库表的名表名,关于实体类名有两种书写方式,一种是全类名,即:从src到类名,这种写法是为了防止碰到相同类名的文件(一般情况下没必要这么写);第二种是直接写类名的简单书写,这种是最常用的;
2. 排序查询
排序查询和基本查询差别不大,主要是在查询的类名后边添加order by+排序依据的列名+排序方式,与sql语句的类似(asc是升序方式,desc是降序方式);
@Test /* * 排序查询 */ public void demo2() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql = "from Customer order by cust_id desc";// asc:升序 desc:降序 Query cust = session.createQuery(sql); List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
3. 条件查询
与sql语句类似,where后边加上根据哪个列进行条件查询,并通过占位符来进行查询;
占位符存在两种,一种是直接用问号,第二种是起代号,注意,起代号的方式需要在代号前加冒号;两种操作如下所示:
@Test /* * 条件查询 */ public void demo3() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); //String sql = "from Customer where cust_id=?";//通过问占位 String sql1 = "from Customer where cust_id=:id ";//通过“代号”占位 Query cust = session.createQuery(sql1); //cust.setParameter(0, 2l);//通过问号占位的从0开始排序 cust.setParameter("id", 2l); List list = cust.list(); System.out.println(list); bt.commit(); session.close(); }
问号占位符需要在setparameter中从0开始排序,
代号占位符需要在setparameter中先写代号,再写条件查询的条件值;
4. 分页查询
分页查询只需要两个关键字,setFirstResults()和setMaxresults(),第一个是起始索引值,第二个每页最大显示数据条数; (起始索引值 = (当前页数-1)* 每页显示条数)
@Test /* * 分页查询 */ public void demo4() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql = "from Customer"; Query cust = session.createQuery(sql); //limit ?,? 索引起始 = (当前页数-1)* 每页要显示的数据条数 cust.setFirstResult(2);//起始索引 cust.setMaxResults(2);//每页显示条数 List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
5. 统计查询
统计查询重点在于关键字,这个关键字和排序查询一样,都在查询语句中,和分页查询的关键字不一样,分页查询的关键字是在代码中,不是在查询语句中;
主要的几个关键字:
- count 统计
- sum 求和
- avg 平均数
- max(min)最大值(最小值)
代码:
@Test /* *统计查询 */ public void demo5() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql_count = "select count(*) from Customer"; String sql_sum = "select sum(cust_id) from Customer"; String sql_avg = "select avg(cust_id) from Customer";//获得的是double类型的返回值 String sql_max = "select max(cust_id) from Customer"; String sql_min = "select min(cust_id) from Customer"; Query cust = session.createQuery(sql_avg); Number uniqueResult = (Number) cust.uniqueResult(); System.out.println(uniqueResult); bt.commit(); session.close(); }
在关键字后的括号内填入根据实体对象的那个属性进行统计查询,不是根据数据库表的列名
接收转化的关键字需要注意,使用uniqueresult方法进行接收,Number类进行存放,Number类型的是封装的接收类,里面封装了各种数据类型的接收方法,直接使用就OK了。
6. 投影查询
投影查询就是查询一个表中某几个自己需要的字段数据,这个查询的好处就是能够简明快速的查询到自己想要的数据,不会浪费内存等资源;
在返回值方面需要注意,返回值是一个list类型的;
@Test /* * 投影查询 * */ public void demo6() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql1 = "select cust_name from Customer"; String sql2 = "select cust_id,cust_name from Customer";//这种显示效果不佳,一般不使用 String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在对应的Customer实体类中构造方法,创建无参构造 Query cust = session.createQuery(sql3); List list = cust.list(); System.out.println(list); bt.commit(); session.close(); }
查询单个字段属性时,直接将表中字段名对应的实体类的属性名写上即可,如果是查询多个而非表中所有时,直接以:
Select new 对象名(属性名1,属性名2,…) from 类名;
注意:此中的对象名的对象是需要在实体类名的类中进行构造的,并且要类中有对应的无参构造,以上面的sql3的查询语句为例,其在Customer类中的对象的构造以及无参构造如下所示:
这个例子中主查询类是Customer,所以其返回值的范型是Customer,运行的结果如下图所示:
从中可以看出,数据变成了一条一条的被放在以一个数据集合中;
pass:本章及学习记录了HQL查询方式的单表查询方式,下章才会把学习的HQL的多表查询方式上传上来,有需要的可以看看下一章
pass:pass:笔记是根据个人理解写出来的,有可能有理解不到位的地方,希望各位发现后可以告诉我,相互进步~