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
相同的比较操作符指定条件
如:
==、<>、<、>、>=、<=
between、not
between
in、not
in
is、like
通过and、or
等逻辑连接符组合各个逻辑表达式
//省略代码
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()方法都可以填充