Chinaunix首页 | 论坛 | 博客
  • 博客访问: 293147
  • 博文数量: 30
  • 博客积分: 732
  • 博客等级: 军士长
  • 技术积分: 439
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-10 00:13
文章分类

全部博文(30)

文章存档

2015年(1)

2013年(5)

2012年(24)

我的朋友

分类: 系统运维

2012-07-18 14:57:57

一.回顾基本的SQL查询
   select/update/delect ... from ... where ...group by... having ...order by... asc/desc
   insert into ... value ...
   update ... set ...
   1.单表查询 select * from xx;
   2.多表查询 A a1,a2 B b1,b2
      1)内关联
          a)相等 
          from A a inner join B b on a.a1 <> b.b1   //a1,b1为字段名,a、b为表的别名
          b)不相等
          from A a inner join B b on a.a1 = b.b1
      2)外关联
          a)左外
          from A a outer left join B b on a.a1 = b.b1;
          b)右外
          from A a outer right join B b on a.a1 = b.b1;
          c)全关联
          from A a full join B b on a.a1=b.b1;
      3)笛卡尔乘积
          from A a cross join B b;
    3.嵌套查询
 
二.HQL和SQL的对比
 
不同:                        HQL                              SQL
    1)              HQL中少了select关键字
    2)from后跟:         实体类名                           表名 
    3)查询条件:          字段名                   查询条件:实体类的属性名
    4)大小写:      区分(类名,属性名)               不区分(表名,字段名)
  
相同:                     查询的关键字都不区分大小写
 
其他:
  hql语句和sql语句的语法以及子句的意义都是一样的
  sql面向表和字段进行查询        关键字、表、字段不区分大小写   结果是记录集合
  hql面向对象和属性进行查询      关键字不区分大小写,对象和属性区分大小写  对象的集合
  有问号占位符(序号是从0开始)(setXXX(序号,值))
  可以用 :别名 的方式
  setXXX("别名",值)
  Hibernate支持分页
  Query.setFirstResult(当前页的第一条记录位置)
  Query.setMaxResult(每页的记录数)
  Query.list执行hql语句,返回List结果集(实体对象,Object[])
 
  投影查询出的结果,是什么数据结构?(二维的Object数组)
 
三.hql语句小结
 
注意: 从Hibernate框架中获取session对象的方式有哪些?
   只有:SessionFacotry.openSession()  因为HibernateSessionFactory.getSession  是MyEclipse做的

1.实体查询:

  1.  //查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并放入list集合中
  2.     Session session = HibernateSessionFactory.getSession();
  3.     String sql = "from User";
  4.     List list = session.createQuery(hql).list();
2.实体的更新与删除
  1.      Session session = HibernateSessionFactory.getSession();
  2.      Transaction trans = session.beginTransaction();
  3.      String sql = "update User user set user.age=20 where user.name='admin'";
  4.      Query query = session.createQuery(hql);
  5.      trans.commit();
3.属性查询

1)检索对象的单个属性:
  1. String hql = "select user.name from User user";
  2. List list = session.createQuery(hql).list;
  3. for(Object o : list) {
  4.     System.out.println(o.toString());
  5. }
2)检索对象的多个属性

a)使用object 数组形式返回
  1. String hql="select user.name,user.age from User user";
  2.  list list = session.createQuery(hql).list;
  3.  for(int i=0;i<list.size();i++) {
  4.     Object[] obj = (Object[])list.get(i);
  5.     System.out.println(obj[0]);
  6.     System.out.println(obj[1]);
  7. }
b)使用面向对象的思想
//注意select语句中的new User
  1. String hql ="select new User(user.name,user.age) from User user";
  2. List list = session.createQuery(hql).list();
  3. for(int i=0;i<list.size();i++)
  4.     System.out.println(user.getName());
  5.     System.out.println(user.getAge());
  6. }
4.排序与分组
1)排序 
eg.    from User user order by user.name asc,user age desc;
2)分组 count() sum() max() min() avg()
       select count(user),user.age from User user group by user.age having count(user)>10;  
          
四.参数绑定

1.按参数名称绑定(定义命名参数以:开头)

  1. String hql = "from User user where user.name=:username and user.age:=userage";
  2. Query query = session.createQuery(hql);
  3. query.setString("username",name);
  4. query.setInt("userage",age);
2.按参数位置绑定:用"?"来定义参数位置,形式如下:

  1. String hql = "from User user where user.name=? and user.age=?";
  2. Query query = session.createQuery(hql);
  3. query.setString(0,name);
  4. query.setInt(1,age);
注:推荐用第一种,增加了程序的可读性

3.setParameter()方法,支持通过setParameter()方法设置任意类型的参数

  1. String hql = "from User user where user.name=:username";
  2. Query query = session.createQuery(hql);
  3. query.setParameter("username",name,Hibernate.STRING);
方法包含三个参数 setParameter(命名参数名称,命名参数值,命名参数映射类型);
第三个参数可以省略,可以自动得到此类型

五.使用Hibernate进行分页查询

逻辑分页(效率低不推荐)和物理分页(不用数据库不同mysql limit语句 oracle为rownum语句)

查询出第2页的所有用户数据示例,每页最大记录为10

  1. int pageNo = 2;
  2. int pageSize = 10;
  3. String hql = "from User";
  4. Query query = session.createQuery(hql);
  5. query.setFirstResult((pageNo - 1) * pageSize);
  6. query.setMaxResults(pageSize);
  7. query.list();

阅读(16000) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~