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、又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装

标签