七:Hibernate查询

七:Hibernate查询

query:查询

criteria:标准

restriction:约束条件

pagination:分页

exact:精确的

anywhere:无论何处

目标

7.1:Hibernate查询

7.1.1:为什么使用HQL

7.1.2:如何使用HQL

7.1.3:HQL的丰富功能

7.2:Criteria查询

7.2.1:为什么使用Criteria查询

7.2.2:如何使用Criteria查询

小结:

目标

Hibernate支持两种主要的查询方式:HQL(HibernateQueryLanguage,Hiberante查询语言)查询和Criteria(criteria,n.标准)查询。HQL查询时一种面向对象的查询语言,其中没有表和字段的概念,只有类和属性的概念。Criteria查询又称为“对象查询”,用面向对象的方式将构造查询过程作了封装。

7.1:Hibernate查询

7.1.1:为什么使用HQL

JDBC查询方法:繁复的SQL语句,手动封装结果到对象并存放到集合中。代码繁复,易出错。

HQL是Hibernate提供的面向对象查询语言,不用编写繁复的SQL语句,查询结果是直接存放在List中的对象,并且,HQL是独立于数据库的,对不同的数据库根据Hibernatedialect(方言,土语)属性的配置自动生成不同的SQL语句。

7.1.2:如何使用HQL

使用HQL4步走:1,得到session;2,编写HQL语句;3,创建Query对象;4,执行查询得到结果。

示例:

Sessionsession=super.getSession();//

Stringhql="fromTblFwxx";

Queryquery=session.createQuery(hql);

Listlist=query.list();

在HQL语句中,from关键字不区分大小写,但后面跟的是类名而不是表名要区分大小写,可以只是类名也可以包含包名,可以没有select子句,可以给类名指定别名,as关键字可省。

(关键字,类名,子句,别名)

7.1.3:HQL的丰富功能

1,属性查询(单个,多个)

单个属性,多个属性的查询结果都保存在List中,只是:单个属性的时候,数据类型是属性的类型;多个的时候,每条数据保存在Object数组中。

2,参数查询

支持where子句,支持like关键字,支持"%"通配符。直接拼凑HQL语句容易带来安全隐患,可以使用"?"作占位符,命名参数定义参数。

"?"作占位符(参数少时使用):可以通过Query的setObject方法逐个设置参数的值,需保证每个占位符都设置了参数值,设置参数值时下标从0开始。缺点:代码可读性下降(须仔细比对才能知道哪个设置参数的语句对应到哪个占位符上,不易查找错误),参数的下标被硬编码参数顺序调整,代码也需跟着调整(不便)。

参数命名:以格式":参数名"定义,通过名称逐个设置参数的值(增强了程序的可读性和可维护性)

HQL支持的运算符:>,<,=,>=,<=,<>(不等于)和isnull等运算符,支持and,or,not和括号,而且支持in和between。(运算符,isnull,and,or,not,(),in,between)。

3,关联查询

关联条件等式的两端都是对象,Hibernate通过两个对象主键值是否相等判断两个对象是否相等。

4,分页查询

通过Query.setFirstResult()和query.setMaxResults()设置从第几条数据开始,共返回几条数据。参数分别是(pageNumber-1)*pageSize和pageSize。

5,统计查询

通过count函数得到数据条数。Hibernate支持的函数有min(),max(),avg()。当查询的结果只有一条数据时,可以通过query.uniqueResult()方法直接或得结果。例如:intcount=(Integer)query.uniqueResult()。

7.2:Criteria查询

7.2.1:为什么使用Criteria查询

Criteria查询(对象查询)采用面向对象的方式(主要是Criteria对象)封装查询条件,并提供Restrictions等类别作为辅助(使编写查询代码更方便,代码更易读)。

7.2.2:如何使用Criteria查询

(一般构造复杂的查询方法时使用)

1,创建Criteria对象,传入对应实体类的类型对象;2,使用Restrictions对象的静态方法(like,ge,le,in...)构造查询条件;参数分别是(属性名,查询条件的值,关键字的匹配方式)。[关键字的匹配方式有:MathMode.ANYWHERE,MathMode.End,MathMode.START,MathMode.EXACT(精确查询)]。查询的排序方法通过Crieteria的addOrder方法指定(还支持分页查询)。

代码:

//1,

Criteriac=session.createCriteria(TblFwxx.class);

if(null!=condition){

if(condition.getTitle()!=null&&!condition.getTitle().equals("")){

//2,

c.add(Restrictions.like("title",condition.getTitle(),MatchMode.ANYWHERE));

}

if(condition.getZj1()!=0){

c.add(Restrictions.ge("zj",condition.getZj1()));

}

if(condition.getZj2()!=0){

c.add(Restrictions.le("zj",condition.getZj2()));

}

if(condition.getLxIds().length>0){

c.add(Restrictions.in("lx.lxid",condition.getLxIds()));

}

}

//排序

c.addOrder(Order.asc("fwid"));

returnc.list();

小结:

HQL支持两种主要的查询方式:HQL查询和Criteria查询。

HQL是一种面向对象的查询语言,支持属性查询,参数查询,关联查询,分页查询等特性,并支持SQL函数(count....)。

执行HQL语句首先要创建Query对象,Query对象封装了查询条件所需要的大部分操作(设置参数,执行查询,设置反回数据的开始位置和总的返回条数等)。

复杂的查询使用Criteria将更方便,Criteria采用面向对象的方式查询条件的组装过程进行了封装。Restrictions提供了很多静态方法用于构造查询条件。

相关推荐