初学HQL注意的问题:
1.HQL是面向对象的查询语言,对java类与属性大小写敏感<br>2.HQL对select,from where等关键字不区分大小写,为了可读性和美观,习惯上将其写为小写
3.HQL与SQL,形式相同,本质不同
Query接口
HQL语句------(Hibernate)----->解析HQL语句,配置信息---->SQL语句Query接口支持方法链编程的风格,使得代码更为简洁
Query实例的创建
1.Session的createQuery()方法创建Query实例2.createQuery方法包含一个HQL语句参数,createQuery(HQL)
Query执行查询
1.Query接口的list方法执行HQL查询2.list()方法返回结果数据类型为java.util.List,List集合中存放符合查询条件的持久化对象
from子句
1、HQL语句最简形式2.from制定了HQL语句查询主体--持久化类及其属性
Session session=HibernateSessionFactory.getSession();
String hql="from Seller";
Query query=session.createQuery(hql);
List<Seller> sellers=query.list();
for(Seller seller:sellers){
System.out.println(seller);
}
from子句中别名的应用
1.为被查询的类指定别名2.在HQL语句其他部分通过别名引用该类
3.别名命名习惯(一般和持久化类的类名保持一致,但是也要考虑代码的可读性)
1.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[] obj:list){
System.out.println(obj[0]);
System.out.println(obj[1]);
}
select子句中如果只有一个查询的话,返回的数据类型不是对象数组,而是对象
String hql="select s.name from Seller s";
Query query=session.createQuery(hql);
List<Object> list=query.list();
for(Object obj:list){
System.out.println(obj);
}
2.通过List返回查询结果
String hql="select new List(s.name,s.tel) from Seller s";Query query=session.createQuery(hql);
List<List> list=query.list();
for(List obj:list){
System.out.println(obj.get(0));
System.out.println(obj.get(1));
}
3.通过Map返回查询结果
String hql="select new Map(s.name,s.tel as tel) from Seller s";Query query=session.createQuery(hql);
List<Map> list=query.list();
for(Map obj:list){
System.out.println(obj.get("0"));
System.out.println(obj.get("tel"));
}
4.通过自定义类型返回查询结果
首先建立一个构造器public Seller(String name, String tel) {
this.name = name;
this.tel = tel;
}
然后
String hql="select new Seller(s.name,s.tel) from Seller s";
Query query=session.createQuery(hql);
List<Seller> list=query.list();
for(Seller obj:list){
System.out.println(obj.getName());
System.out.println(obj.getTel());
}
使用distinct关键字去除查询结果中重复元素
where子句
比较运算
String hql="form Commdity c where c.price>400";null值判断运算
String hql="form Commdity c where c.description is null";//或者c.description=null,is not ,<>
范围运算
[not] in, [not] between 值1 and 值2String hql="form Customer c where c.age in [20,40]";
字符串模式匹配
like, % ,_String hql="form Customer c where c.name like '张_'";
逻辑运算
and(与),or(或) ,not(非)集合运算
is [not] empty(相当于exists), member of(元素属于集合 in)String hql="form Order o where o.orderItems is not empty";
查询单个对象
1.Query接口的uniqueResult方法2.where字句条件的设置,,保证返回一个结果或者没有结果
String hql="form Customer c where c.age=20";
Customer c=(Customer)query.uniqueResult();
Order by字句
asc ,descString hql="form Commdity order by seller,id asc, price desc ,name asc";