首页 > 代码库 > HQL

HQL

使用HQL(hibernate query language)

  1. 与SQL相似,SQL中的语法基本都可使用

  2. SQL查询的是表和表中的列,HQL查询的是对象和对象中的属性

  3. HQL关键字不区分大小写,但是类名和属性是区分大小写的

  4. SELECT可以省略

HQL的基本查询语法:

  1. 简单的查

hql = "FROM Employee";
hql = "FROM Employee AS e"; // 使用别名
hql = "FROM Employee e"; // 使用别名,as关键字可省略

2.带上过滤条件的查询(可以使用别名):where

hql = "FROM Employee where id<10";
hql = "FROM Employee e WHERE e.id<10";
hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

3.带上排序条件: order by

hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";    //DESC降序
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC"

4.指定select 子句,不能使用select *

hql = "SELECT e FROM Employee e"; // 相当于"FROM Employee e"
hql = "SELECT e.name FROM Employee e"; // 只查询一个列,返回的集合的元素类型就是这个属性的类型
hql = "SELECT e.id,e.name FROM Employee e"; // 查询多个列,返回的集合的元素类型是Object数组
hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new语法,指定把查询出的部分属性封装到对象中

5.执行查询获得结果(list,uniqueResult,分页)

Query query=session。createQuery("from Employee e where id<10");
query.setFirstResult(0);    //设置开始查询处
query.setMaxResults(10);    //设置每次查询数量
List list=query.list();    //查询结果是以俄国list集合
Employ employ=(Employ)query.uniqueResult();    //查询的结果是唯一的结果,将此结果取出,若有多个会抛出异常

//方法链的方式查询:
List list = session.createQuery(//
    "FROM Employee")//
    .setFirstResult(0)//
    .setMaxResults(10)//
    .list();
    
//执行查询:
List list = session.createQuery(hql).list();

 高级查询:

  1. 聚集查询:

聚集函数:count(*)--记录的行数,max("")--返回一列中最大的值,min(),avg()--返回平均数,sum()

hql = "SELECT COUNT(*) FROM Employee"; // 返回的结果是Long型的
hql = "SELECT min(id) FROM Employee"; // 返回的结果是id属性的类型
Number result = (Number) session.createQuery(hql).uniqueResult();

2.分组:group by....hanving

group by详细分析

“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理(count,sum,AVG....)

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组
SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";

3.连接查询:

将查询结果合并为一个表
内连接(inner关键字可以省略)
hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";
左外连接(outer关键字可以省略,前面表全部保留)
hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";
右外连接(outer关键字可以省略,后面表全部保存)
hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";
可以使用更方便的方法
hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

4.查询时使用参数

方法一:使用?站位

hql="from Employee where id between ? nad ?"
List list=session.createQuery(hql)//
    .setParameter(0,5)//设置参数,第一个参数索引为0,设置其值为5
    .setParmeter(1,15)//设置参数,第一个参数索引为1,设置其值为15
    .list();

方法二:使用变量名

hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
List list = session.createQuery(hql)    //
	.setParameter("idMax", 15)    //
	.setParameter("idMin", 5)    //
	.list();
	
当参数是集合的时候,一定要使用setParameterList()设置参数值
hql = "FROM Employee e WHERE id IN (:ids)";
List list = session.createQuery(hql)//
	.setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })//
	.list();

5.update与delete,不会通知Session缓存

// >> Update
 int result = session.createQuery(//
"UPDATE Employee e SET e.name=? WHERE id>15")//
	.setParameter(0, "无名氏")//
	.executeUpdate(); // 返回int型的结果,表示影响了多少行