HQL定义:
- HQL(Hibernate Query Language)Hibernate查询语言
- HQL是面向对象的查询语言(查询的主体是映射的持久化类及其属性)
- HQL提供了丰富灵活的查询特性,Hibernate官方推荐的查询方式
HQL语句形式
select......from......where......group by......having......order by......
HQL注意问题
- HQL是面向对象的查询语言,对java类与属性大小写敏感
- HQL对关键字不区分大小写(习惯上小写)
Query接口简介
org.hibernate.Query接口
- Query接口定义有执行查询的方法(该方法完成了HQL语句的解析和执行过程,并返回查询结果)
- Query接口支持方法链编程(方法链编程:就是调用方法后 返回的方法结果 还是调用这个方法的对象。因此调用该对象的方法后还可以直接调用该对象的其他方法)风格,使得程序代码跟为简洁
Query实例的创建
Session的createQuery()方法创建一个Query实例
CreateQuery方法包含一个HQL语句参数,Create(hql);
Query执行查询
Query接口的list()方法执行HQL查询
list()方法返回结果数据类型为java.util.List,List集合中存放符合查询条件的持久化对象
from子句
- HQL语言最简形式
- from指定了HQL语言查询主体-持久化类及其属性
- 不需要引入持久化类的全限名,直接引入类名。因为在解析持久化类是hibernate会auto-import(自动引入)缺省情况
- 通过"as"或" "为持久化类起别名,和SQL Server语法一样。在HQL语句的其他部分可以通过别名引用该类
代码示例:
//编写hql语句查询实例化类
String hql ="from Seller s";
//创建Query实例对象
Query query = session.createQuery(hql);
//执行hql查询
List<Seller> sellers = query.list();
//在控制台中输出 在Seller类中已经重写了toString()方法
for(Seller seller:sellers){
System.out.println(seller);
}
选择---select子句
以Object[] 形式返回选择的属性 (如果没有指定返回的类型,默认Object[]) (如果select选择的属性只有一个,则返回的是Object对象而不是Object[])
代码示例:
String hql ="select s.name,s.tel from Seller s";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] objs:list){
System.out.println("name:"+objs[0]);
System.out.println("tel:"+objs[1]);
}
以List形式返回选择的属性(select子句中使用new list指定)
代码示例:
String hql ="select new list ( s.name,s.tel ) from Seller s";
Query query = session.createQuery(hql);
List<List> lists = query.list();
for(List list:lists){
System.out.println("name:"+list.get(0));
System.out.println("tel:"+list.get(1));
}
以map形式返回选择属性(select子句中使用 new map指定。key值为索引值,字符串类型)
代码示例:
代码示例:
String hql ="select new map ( s.name n,s.tel) from Seller s";
Query query = session.createQuery(hql);
List<Map> maps = query.list();
for(Map map: maps){
//通过别名获取
//通过别名获取
System.out.println("name:"+map.get("n"));
//通过序号获取
//通过序号获取
System.out.println("tel:"+map.get("1"));
}
以自定义类型返回选择的属性(持久化类中有对应的构造器,select子句中调用定义的构造器)
代码示例:
代码示例:
String hql ="select new Seller( s.name,s.tel ) from Seller s";
Query query = session.createQuery(hql);
List<Seller> sellers = query.list();
for(Seller seller : sellers){
System.out.println("name:"+seller.getName());
System.out.println("tel:"+seller.getTel());
}
去掉重复的结果------distinct关键字
代码示例:
String hql ="select distinct c.sex from customer c";
Query query = session.createQuery(hql);
List<Object> lists = query.list();
for(Object obj :lists){
System.out.println(obj);
}
限制--where子句(通过逻辑表达式设置查询条件,限制返回的查询结果
比较运算(持久化类的属性 和 给定的查询条件之间的比较)
比较运算符: = , < > , < , > , > = , < =
null值判断--------is [not] null (is null和=效果一样,is not null 和< >效果一样)
范围运算
[not] in(列表 / 子查询)-------返回true/false
[not] between 值1 and 值2
字符串模式匹配
like关键字,通配符 % :(任意个字符), _ : (一个字符)
逻辑运算
and(逻辑与)
or(逻辑或)
not(逻辑非)
集合运算
is [not] enpty 集合[不]为空,不包含任何元素
members of 员孙属于集合
在HQL中使用 + - * / 运算符
四则运算符可以在where子句和select子句中使用
//代码示例
String hql = " from Commodity c where c.price*5>3000 ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("price:"+c.getPrice()*5);
}
查询单个对象(uniqueResult方法)
wherer子句的条件设置,似的查询结果最多只有一个。
示例代码:
String hql = " from Customer c where c.age>20 ";
Query query = session.createQuery(hql);
Customer c = (Customer)query.uniqueResult();
System.out.println(c.getName());
排序--order by子句
升序排序asc
降序排序desc
示例代码:
String hql = " from Commodity order by seller.id asc,price desc,name asc ";
Query query = session.createQuery(hql);
List<Commodity> commodities = query.list();
for(Commodity c : commodities){
System.out.println("name:"+c.getName());
System.out.println("price:"+c.getPrice());
}