七: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(Hibernate Query Language,Hiberante查询语言)查询和Criteria(criteria ,n. 标准 )查询。HQL查询时一种面向对象的查询语言,其中没有表和字段的概念,只有类和属性的概念。Criteria查询又称为“对象查询”,用面向对象的方式将构造查询过程作了封装。
7.1:Hibernate查询
7.1.1:为什么使用HQL
JDBC查询方法:繁复的SQL语句,手动封装结果到对象并存放到集合中。代码繁复,易出错。
HQL是Hibernate提供的面向对象查询语言,不用编写繁复的SQL语句,查询结果是直接存放在List中的对象,并且,HQL是独立于数据库的,对不同的数据库根据Hibernate dialect(方言,土语)属性的配置自动生成不同的SQL语句。
7.1.2:如何使用HQL
使用HQL4步走:1,得到session;2,编写HQL语句;3,创建Query对象;4,执行查询得到结果。
示例:
Session session =super.getSession();//
String hql="from TblFwxx";
Query query=session.createQuery(hql);
List list=query.list();

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

7.1.3:HQL的丰富功能
1,属性查询(单个,多个)
单个属性,多个属性的查询结果都保存在List中,只是:单个属性的时候,数据类型是属性的类型;多个的时候,每条数据保存在Object数组中。
2,参数查询
支持where子句,支持like关键字,支持"%"通配符。直接拼凑HQL语句容易带来安全隐患,可以使用"?"作占位符,命名参数定义参数。
"?"作占位符(参数少时使用):可以通过Query的setObject方法逐个设置参数的值,需保证每个占位符都设置了参数值,设置参数值时下标从0开始。缺点:代码可读性下降(须仔细比对才能知道哪个设置参数的语句对应到哪个占位符上,不易查找错误),参数的下标被硬编码参数顺序调整,代码也需跟着调整(不便)。
参数命名:以格式":参数名"定义,通过名称逐个设置参数的值(增强了程序的可读性和可维护性)
HQL支持的运算符:>,<,=,>=,<=,<>(不等于)和is null等运算符,支持and,or,not和括号,而且支持in和between。(运算符,is null,and ,or,not,(),in,between)。
3,关联查询
关联条件等式的两端都是对象,Hibernate通过两个对象主键值是否相等判断两个对象是否相等。
4,分页查询
通过Query.setFirstResult()和query.setMaxResults()设置从第几条数据开始,共返回几条数据。参数分别是(pageNumber-1)*pageSize和pageSize。
5,统计查询
通过count函数得到数据条数。Hibernate支持的函数有min(),max(),avg()。当查询的结果只有一条数据时,可以通过query.uniqueResult()方法直接或得结果。例如:int count=(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,
Criteria c=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"));
return c.list();
小结:
HQL支持两种主要的查询方式:HQL查询和Criteria查询。
HQL是一种面向对象的查询语言,支持属性查询,参数查询,关联查询,分页查询等特性,并支持SQL函数(count....)。
执行HQL语句首先要创建Query对象,Query对象封装了查询条件所需要的大部分操作(设置参数,执行查询,设置反回数据的开始位置和总的返回条数等)。
复杂的查询使用Criteria将更方便,Criteria采用面向对象的方式查询条件的组装过程进行了封装。Restrictions提供了很多静态方法用于构造查询条件。

你可能感兴趣的:(sql,C++,c,Hibernate,C#)