本文共 8922 字,大约阅读时间需要 29 分钟。
HQL是面向对象的查询语言,它和SQL查询语言有些相似,但它使用的是类、对象和属性的概念,而没有表和字段的概念。在Hibernate提供的各种检索方式中,HQL是官方推荐的查询语言,也是使用最广泛的一种检索方式。
它具有如下功能:创建一个Customer实体类
package pers.zhang.domain;public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String cust_mobile; public Long getCust_id() { return cust_id; } public void setCust_id(Long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; }}
配置ORM元数据:
准备数据:
例子:
@Test //排序查询 public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- String hql2 = " from Customer c order by c.cust_name, c.cust_id desc "; Query query = session.createQuery(hql2); List list = query.list(); System.out.println(list); //---------------------------------------------------- tx.commit(); session.close(); }
运行JUnit测试输出:
Hibernate: select customer0_.cust_id as cust_id1_0_, customer0_.cust_name as cust_nam2_0_, customer0_.cust_source as cust_sou3_0_, customer0_.cust_industry as cust_ind4_0_, customer0_.cust_level as cust_lev5_0_, customer0_.cust_linkman as cust_lin6_0_, customer0_.cust_phone as cust_pho7_0_, customer0_.cust_mobile as cust_mob8_0_ from cst_customer customer0_ order by customer0_.cust_name, customer0_.cust_id desc[Customer [cust_id=1, cust_name=Google], Customer [cust_id=3, cust_name=百度], Customer [cust_id=2, cust_name=联想], Customer [cust_id=5, cust_name=腾讯], Customer [cust_id=4, cust_name=阿里巴巴]]
例子:
//分组查询 @Test public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- //按客户等级分组查询 String hql1 = "select c.cust_level, count(*) from Customer c group by c.cust_level"; //按客户等级分组查询,且等级大于1 String hql2 = "select c.cust_level, count(*) from Customer c group by c.cust_level having c.cust_level > 1"; Query query1 = session.createQuery(hql1); Query query2 = session.createQuery(hql2); List
运行JUnit测试输出:
Hibernate: select customer0_.cust_level as col_0_0_, count(*) as col_1_0_ from cst_customer customer0_ group by customer0_.cust_levelHibernate: select customer0_.cust_level as col_0_0_, count(*) as col_1_0_ from cst_customer customer0_ group by customer0_.cust_level having customer0_.cust_level>1客户等级 个数1 22 23 1客户等级 个数2 23 1
例子:
@Test //统计查询 public void fun5(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- String hql1 = " select count(*) from cn.itcast.domain.Customer "; String hql2 = " select sum(cust_id) from cn.itcast.domain.Customer "; String hql3 = " select avg(cust_id) from cn.itcast.domain.Customer "; String hql4 = " select max(cust_id) from cn.itcast.domain.Customer "; String hql5 = " select min(cust_id) from cn.itcast.domain.Customer "; Query query1 = session.createQuery(hql1); Query query2 = session.createQuery(hql2); Query query3 = session.createQuery(hql3); Query query4 = session.createQuery(hql4); Query query5 = session.createQuery(hql5); Number number1 = (Number) query1.uniqueResult(); Number number2 = (Number) query2.uniqueResult(); Number number3 = (Number) query3.uniqueResult(); Number number4 = (Number) query4.uniqueResult(); Number number5 = (Number) query5.uniqueResult(); System.out.println("总条数:" + number1); System.out.println("id的和:" + number2); System.out.println("id的平均值:" + number3); System.out.println("id的最大值:" + number4); System.out.println("id的最小值:" + number5); //---------------------------------------------------- tx.commit(); session.close(); }
运行JUnit测试输出:
Hibernate: select count(*) as col_0_0_ from cst_customer customer0_Hibernate: select sum(customer0_.cust_id) as col_0_0_ from cst_customer customer0_Hibernate: select avg(customer0_.cust_id) as col_0_0_ from cst_customer customer0_Hibernate: select max(customer0_.cust_id) as col_0_0_ from cst_customer customer0_Hibernate: select min(customer0_.cust_id) as col_0_0_ from cst_customer customer0_总条数:5id的和:15id的平均值:3.0id的最大值:5id的最小值:1
简单到发指…即查询某一列或多列。
需要了解的是HQL提供了一种投影的构造方式查询,格式如下: select new Customer(cust_id, cust_name, cust_level) from Customer 同 时 , 需 要 在 C u s t o m e r 实 体 类 中 添 加 对 应 的 构 造 函 数 , 再 添 加 一 个 显 式 的 空 参 构 造 ! \color{red}{同时,需要在Customer实体类中添加对应的构造函数,再添加一个显式的空参构造!} 同时,需要在Customer实体类中添加对应的构造函数,再添加一个显式的空参构造!public Customer() { }public Customer(Long cust_id, String cust_name, String cust_level) { super(); this.cust_id = cust_id; this.cust_name = cust_name; this.cust_level = cust_level;}
例子:
@Test //投影查询 public void fun6(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- String hql1 = " select cust_name from Customer ";//单行投影 String hql2 = " select cust_name,cust_id from Customer ";//多行投影 String hql3 = "select new Customer(cust_id, cust_name, cust_level) from Customer";//构造投影 Query query = session.createQuery(hql3); Listlist = query.list(); for(Customer c : list) { System.out.println(c.getCust_id() + " " + c.getCust_name() + " " + c.getCust_level()); } //---------------------------------------------------- tx.commit(); session.close(); }
运行JUnit测试输出:
Hibernate: select customer0_.cust_id as col_0_0_, customer0_.cust_name as col_1_0_, customer0_.cust_level as col_2_0_ from cst_customer customer0_1 Google 22 联想 33 百度 24 阿里巴巴 15 腾讯 1
在HQL中提供了型如:from Object 这样的查询。
该查询回返回所有Object的实例及其子类的实例,及所有的表。 Hibernate可以在from子句中指定任何Java 类或接口。查询会返回继承了该类的所有持久化子类的实例或返回声明了该接口的所有持久化类的实例。感觉没什么用。。。不再举例。
转载地址:http://djsqb.baihongyu.com/