随笔 - 0, 文章 - 75, 评论 - 0, 引用 - 0
数据加载中……

HQL实用技术

Hibernate
支持两种主要的查询方式
HQL(Hibernate Query Languge,Hibernate
查询语言)查询
是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念
HQL 是应用较为广泛的方式
Criteria
查询
又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装



使用HQL 可以避免使用JDBC
查询的一些弊端
不需要再编写繁复的SQL 语句,针对实体类及其属性进行查询
查询结果是直接存放在List
中的对象,不需要再次封装
独立于数据库,对不同的数据库根据Hibernate dialect 属性的配置自动生成不同的SQL
语句执行



语法:


[select/update/delete……]
from
Entity
[where……]
[group by……] [having……] [order by……]



使用HQL需要四步:
得到Session
编写HQL语句

创建Query对象
Query接口是HQL 查询接口。它提供了各种的查询功能

执行查询,得到结果



设置别名(alias)


from Street as s 或 from street s
s 是Street 的别名,通过as 关键字指定,关键字as
是可选的


//
省略部分代码


try
{


sessionFactory
=


new
Configuration().configure().
buildSessionFactory();


session
=
sessionFactory.openSession();



String
hql
=
from
Street
”;


Query
query
=
session.createQuery(hql);


List<Street>
list =
query.list();



for(Street
street:list){



System.out.println("街道名称
"
+



street.getDistrict().getName()+""
+
street.getName());



}


}
catch (
HibernateException
e)
{


e.printStackTrace();


}
finally{



//
省略部分代码


}



where
子句指定限定条件

通过与SQL
相同的比较操作符指定条件

如:

==<><>>=<=

betweennot
between

innot
in

islike

通过andor
等逻辑连接符组合各个逻辑表达式



//省略代码


String
hql
="from
Street as s
where
s.name='中关村大街'";


Query
query
=
session.createQuery(hql);


List
userList
=
query.list();


//省略代码



查询实体对象的某个属性(数据库表中的某个字段信息)


String
hql
="select
u.password
from
User as u where u.name='admin'";



获取实体的多个属性


String
hql
="select
u.id,u.password
from
User as u where u.name='admin'";



获取属性类型


//省略代码


String
hql
="select
u.id from
User
as
u
where
user.name='admin'";


Query
query
=
session.createQuery(hql);


List
list
=
query.list();


Iterator
it
=
list.iterator();


if(it.hasNext()){


System.out.println("id
的类型为
:"+
it.next().getClass());


}



参数绑定


"?"占位符

使用“?”作占位符,可以先设定查询参数

通过setType()方法设置指定的参数

必须保证每个占位符都设置了参数值

必须依照“?”所设定顺序设定

下标从0开始,而不是使用PreparedStatement
对象时的从1开始


//省略代码


String
hql
="select
u.password
from
User as u where u.name =
?";


Query
query
=
session.createQuery(hql);


query.setString(0,
"admin");


//省略代码




命名参数

:name
即命名参数

标识了一个名为“name”的查询参数

根据此参数名进行参数值设定

不需要依照特定的顺序


//省略代码


String
hql
="select
u.password
from
User as u where u.name=
:name";


Query
query
=
session.createQuery(hql);


query.setString("name",
"admin");


//省略代码



封装参数

动态设置查询参数

将参数封装为一个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
方法


}


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();


//
省略部分代码



HQL
常用聚合函数

count(
)
:统计函数


select
count(house)
from House h where
h.user_id
=
'1010'



max(
)
min(
)
:最大值和最小值函数


select
max(h.price),min(h.price)
from House h



avg(
)
sum(
)
:平均值和求和函数


select
avg(h.price),sum(h.floorage)
from House h where
h.user_id=
'1000'




SQL类似,HQL
通过order
by
子句实现对查询结果的排序


默认情况下按升序顺序排序


排序策略(asc
升序、desc
降序)


from
House
house
order
by
house.price


from
House
house
order
by
house.price
desc


from
House
house
order
by
house.price
,
house.floorage





分组


通过group
by
子句实现


并使用having
子句对group
by
返回的结果集进行筛选


select
sum(
house.floorage)
from House
house
group
by
house.street_id
having
sum(house.floorage)
> 1000



分页


Query对象提供了简便的分页方法


setFirstResult(int
firstResult)方法



设置第一条记录的位置


setMaxResults(int
maxResults)方法



设置最大返回的记录条数



//
省略部分代码


query.setFirstResult((pageIndex-1)*pageSize);


query.setMaxResults(pageSize);


List
result=
query.list();



总结


Hibernate主要提供哪两种数据查询方式?


为什么使用HQL?


HQL查询参数绑定有几种方式?


HQL常用的聚合函数有哪些?


Hibernate如何实现分页?




备注:


HQL属性优先查询(如果是不写u.*)
优先级:属性-->字段


select u.name from User u


select name from User u



"?"占位符,使用query.setXXX() 或
setParameter()方法都可以填充


 



posted on 2012-04-22 15:51 hantai 阅读(77) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: