Hibernate数据检索 QB查询

来源:互联网 发布:中山慧网淘宝培训 编辑:程序博客网 时间:2024/06/02 12:50

                           
回顾:
1、inverse=true
   
2、多对多关系的中间表

 


                Hibernate数据检索
内容:
 本章讲解了Hibernate中的两种查询操作的使用:Criteria、HQL,并介绍了各自的优点,最后又讲解了Hibernate对分页的支持。
产品:Eclipse 3.2
技术:Hibernate、JDBC
难度:
 ★★★☆☆  

本章重点:
了解Criteria Query的使用
掌握Hibernate查询语言(HQL)的使用

一 、了解Criteria Query的使用

1、概述

是通过面向对象化的设计,将数据查询条件封装为一个对象。简单来讲,Criteria Query 可以看作是传统SQL的对象化表示,如下范例所示

2、Criteria Query范例

  Criteria  criteria=session.createCriteria(Person.class);
  criteria.add(Expression.eq(“name”,”wms”));
criteria.add(Expression.eq(“sex”,new Integer(1));

这里的criteria实例本质上是对SQL”Select * from t_user where name=’wms’ and sex=1”的封装。
Hibernate在运行期会自动根据Criteria中指定的查询条件(也就是上面代码中通过criteria.add方法添加的查询表达式)生成相应的SQL语句。
这种方式的特点是比较符合java程序员的编码习惯,并且具备清晰的可读性。


 


数据库脚本

 
create  table person(
  id int identity(1,1) primary key,
  name varchar(20) not null,
  age int,
  sex  varchar(2)
)

insert into person  values('张三',20,'男');
insert into person  values('王五',25,'男');
insert into person  values('李四',30,'女');
insert into person  values('小明',31,'男');
insert into person  values('小花',50,'女');


select * from person 


3、Criteria 查询表达式

Criteria本身只是一个查询容器,具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。
如前面所示,Expression对象具体描述了查询条件。针对SQL语法,Expression提供了对应的查询限定机制,见下表。
Criteria 查询表达式(1)

Criteria 查询表达式(2)

Criteria 查询表达式(3)
 
方法 属性    
Expression.in 对应SQL “field in...”表达式   
Expression.or or关系组合。如:
Expression.or(Expression.eq(“name”,”张三”), Expression.eq(“name”,”李四”))   
Expression.and
 and关系组合。如:
Expression.and(Expression.eq(“name”,”张三”), Expression.eq(“age”,20)) 

注意:in操作最实用,官方推荐的
 
二、掌握Hibernate查询语言(HQL)的使用

1、HQL语法结构

◇[select/update/delelte...]
[from ...]
[where...]
[group by...[having...]]
[order by...]

其中update/delete为hibernate3.0引入的

2、查询操作

HQL中使用distinct
Query query=session.createQuery(“select distinct p.age from Person as p”);
HQL中使用count()
Query query=session.createQuery(“select count(*) from Person as p”);
Query query=session.createQuery(“select count(p.id) from Person as p”);
HQL中使用avg()
Query query=session.createQuery(“select avg(p.age) from Person as p”);
HQL中使用upper()
Query query=session.createQuery(“select upper(p.name) from Person as p”);
HQL中使用where子句
1)可以使用where子句来限定查询的条件,除了=运算之外,还有>、>=、<、<=、!=或<>等比较运算,例如:
Query query=session.createQuery(“from Person as p where p.name=’wms’”);
2)可以在where子句上进行表达式:
   from Person p where (p.age/10=3)
3)可以在where子句上使用and、or:
   from Person p where(p.age>20) and (p.name=’wms’)
4)is not null与is null则可以测试字段值是否为空值
   from Person p where p.name is not null
5)between可以测试字段值是否在指定的范围之内
   from Person p where p.age between 20 and 30
6)使用in或not in来测试字段值是否在指定的集合中
   from Person p where p.name in(‘wms’,’accp’)
7)like与not like可以进行模糊条件搜寻:
   from Person p where p.name like ‘w%’

对查询结果使用order by进行排序
   from Person p order by p.age
1)使用desc反排序:
   from Person p order by p.age desc
2)同时指定两个以上的排序方式,例如先按照”age”反序排列,如果
“age”相同,则按照”name”顺序排列:
   from Person p order by p.age desc,p.name
配合GROUP BY子句,自动将指定的字段依相同的内容群组:
   select p.sex,avg(p.age) from Person p group by p.sex
可以结合having子句,例如只将平均大于20的数据分组显示出来
"select p.sex,avg(p.age) from Person p "+
                    "where p.age>0 "+
                    "group by p.sex "+
             "having avg(p.age)>35";
3、绑定参数
  
给定参数名
 
String hql="from Person as p where p.name=:name";
q.setString("name", "张三"); 
给定参数位置
 
       String hql="from Person as p where p.name=?";
       Query q=session.createQuery(hql);
       q.setString(0, "张三"); 


4、更新、删除

更新:
    update User set name=’wms’ where name=’accp’
    注意不用使用别名
删除:
delete  Person  where name=’wms’

5、hibernate分页 
在Hibernate的Criteria和Query接口中提供了以下两个方法,
用于完成分页功能
◇setFirstResult(100);从第几个行开始取,下标从0开始
◇setMaxResults(20); 取多少个行
Criteria
 
Criteria  cri=session.createCriteria(Person.class);
cri.setFirstResult(0);
cri.setMaxResults(2);
List all=cri.list(); 

参数绑定与语句简写

Query
 
public List findBySpecialBoardAndPageSize(Board board, int pageSize,
            int pageNo) {
        String queryString = "from persistent.module.Topic as t where t.board=:board order by t.postTime desc ";
        List postList = getSession().createQuery(queryString)
                .setEntity("board", board)
                .setFirstResult(pageSize * (pageNo - 1))
                .setMaxResults(pageSize)
.list();
        log.info("PostList size ="+postList.size());
        return postList;
    } 

 

 

 

 

思考题:
   Query的高级查询
关联查询:
引用查询:在xml中配置sql语句
联合查询:使用join
投影查询:只取几列
子查询:实现关联查找

原创粉丝点击