HQL实用技术
1、hibernate查询语言
1.1、为什么使用HQL
1.1.1、使用hql可以避免使用jdbc查询的一些弊端
1.1.2、不需要在编写繁复的sql语句,针对实体类及其属性进行查证
1.1.3、查询结果是直接存放在list中的对象,不需要再次封装
1.1.4、独立于数据库,对不同的数据库汾酒hibernate dialect属性的配置自动生成不同的sql语句执行。
1.2、如何使用HQL
1.2.1、得到Session
1.2.2、编写HQL语句
1.2.3、创建Query对象
1.2.4、执行查询,得到结果
public class TestHQL{
public static void main(String[]args){
SessionFactory sf=null;
Session s=null;
try{
sf=new Configuration().configure().buildSessionFactory();
s=sf.openSession();
String hql="from Street";
Query q=session.createQuery(hql);
List<Street>list=q.list();
for(Street s:list){
System.out.println("街道名称"+s.getDistrict().getName()+"区"+s.getName());
}
}case(HibernateException e){
e.printStackTrace();
}finally{
s.close();
sf.close();
}
}
}
2、实体查询
2.1、where查询
String hql="from Street as s where s.name='中关村大街' ";
Query q=session.createQuery(hql);
List userList=q.list();
2.2、where子句指定限定条件
通过与SQL 相同的比较操作符指定条件
如:
==、<>、<、>、>=、<=
between、not between
in、not in
is、like
通过and、or 等逻辑连接符组合各个逻辑表达式
3、属性查询
3.1、查询实体对象的某个属性(数据库表中的某个字段信息)
String hql="select u.password from User u where u.name='admin' ";
3.2、获取实体的多个属性
String hql="select u.id u.password from User u where u.name='admin' ";
3.3、获取属性的类型
String hql="select u.id u.password from User u where u.name='admin' ";
Query q=session.createQuery(hql);
List list=q.list();
if(it.hasNext()){
System.out.println("id的类型为:"+it.next().getClass());
}
4、参数绑定
4.1、"?"占位符
使用"?"占位符,可以先设定查询参数
通过setType()方法设置指定的参数
必须保证每个占位符都设置了参数值
必须依照"?"所设定顺序设定
必须从0开始,而不是使用PreparedStatement对象的从1开始
String hql="select u.password from User u where u.name=? ";
Query q=session.createQuery(hql);
q.setString(0,"admin");
4.2、命名参数
:name即命名参数
标识了一个名为"name"的查询参数
根据此参数名进行参数设定
不需要依照特定的顺序
String hql="select u.password from User u where u.name=:name";
Query q=createQuery(hql);
q.setString("name","admin");
4.3、封装参数
动态设置查询参数
将参数封装为一个bean
通过Query 对象的setProperties(Object bean)实现参数的设定
public class QueryProperties {
private String title; //标题
private Double high_price; //价格最高值
private Double low_price; //价格最低值
private String type_id; //房屋类型编号
private String street_id; //街道编号
private Integer small_floorage; //面积最小值
private Integer big_floorage; //面积最大值
//省略setter 和getter 方法
}
QueryProperties qp=new QueryProperties();
qp.setLow_price(500); // 省略部分代码
StringBuffer queryString = new StringBuffer();
queryString.append("from House where ");
queryString.append("(title like :title) ");
queryString.append("and (street_id like :street_id) ");
queryString.append("and (type_id like :type_id) ");
queryString.append("and (price between :low_price and :high_price) ");
queryString.append("and(floorage between :small_floorage and :big_floorage)
// 省略部分代码
Query query = session.createQuery(queryString.toString());
query.setProperties(qp);
List<House> list = query.list();
for(House h:list){
System.out.println(house.getTitle()+"\t\t"+house.getPrice()+"\t\t"+house.getFloorage()
+"\t\t"+house.getStreet().getDistrict().getName()+"\t\t"+house.getStreet().getName());
}
// 省略部分代码
5、使用聚合函数
5.1、常用的聚合函数
count():统计函数
select count(hose) from Hose h where h.user_id='1010'
max()和min():最大值和最小值
select max(h.price),min(h.price) from Hose h
avg()和sum():平均值和求和函数
select avg(h.price),sum(h.floorage) from Hose h where h.user_id='1000'
6、排序
6.1、与SQL类似,HQL 通过order by 子句实现对查询结果的排序
from House h order by h.price
6.2、默认情况下按升序顺序排序
from Hose h order by h.price desc
6.3、可以指定多个排序条件
from Hose h order by h.price,h.floorage
7、分组
select sum(h.floorage) from Hose h group by h.street_id having sum(h.floorage)>100
8、分页
8.1、Query对象提供了简便的分页方法
8.1.1、setFirstResult(int firstResult)方法
设置第一条记录的位置
8.1.2、setMaxResults(int maxResults)方法
设置最大返回的记录条数
8.2、步骤
8.2.1、根据结果获得总记录数
int count=list.size();
8.2.1、通过Query的scroll()方法获得ScrollableResults对象,从而获取总记录数
ScrollableResults s=query.scroll();
s.last();
if(s.getRowNumber()>=0){
this.totalResults=this.s.getRowNumber()+1;
}else{
this.totalResults=0;
}
8.2.2、计算总页数
int totalpages=(count%pageSize==0)?(count/pageSiz):(count/pageSize+1)//pageSize每页显示记录数,自定义大小
8.2.3、实现分页
query.setFirstResult((pageIndex-1)*pageSize);
query.setMaxResults(pageSize);
List result=query.list();//得到分页结果
9、子查询
select * from House as h1 where h1.price > ( select avg(h2.price) from House h2 where h2.street_id = '1000')
10、Hibernate 支持两种主要的查询方式
10.1、HQL(Hibernate Query Languge,Hibernate 查询语言)查询
10.1.1、是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念
10.1.2、HQL 是应用较为广泛的方式
10.2、Criteria 查询
10.2.1、又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装