HIbernate3 查询方法

HQL查询方式 
这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。 
示例: 
   1: Session session = SessionFactory.getCurrentSession(); 
   2: User user = null; 
   3: Transaction ts = session.beginTransaction(); 
   4: try { 
   5:     Query query = session.createQuery("from User as u where name='ijse'"); 
   6:     user= (User) query.list().get(0); 
   7:     session.commit(); 
   8: } catch (HibernateException ex) { 
   9:     ts.rollBack(); 
  10:     ex.printStackTrace(); 
  11: } 
  12: System.out.println(user.getName()); 
QBC(Query By Criteria) 查询方式 
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤: 
1. 使用Session实例 的createCriteria()方法创建Criteria对象 
2. 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。 
3. 使用Criteria对象的list()方法进行查询并返回结果 
Restrictions类的常用方法: 
方法名称 描述 
Restrictions.eq 等于 
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对 
Restrictions.gt 大于 
Restrictions.ge 大于等于 
Restrictions.lt 小于 
Restrictions.le 小于等于 
Restrictions.between 对应SQL的between 
Restrictions.like 对应SQL的like 
Restrictions.in 对应SQL的in 
Restrictions.and and关系 
Restrictions.or or关系 
Restrictions.sqlRestriction SQL限定查询 
Order类的常用方法: 
方法名称 描述 
Order.asc 升序 
Order.desc 降序 
Projections类的常用方法 
方法名称 描述 
Projections.avg 求平均值 
Projections.count 统计某属性的数量 
Projections.countDistinct 统计某属性不同值的数量 
Projections.groupProperty 指定某个属性为分组属性 
Projections.max 求最大值 
Projections.min 求最小值 
Projections.projectionList 创建一个ProjectionList对象 
Projections.rowCount 查询结果集中的记录条数 
Projections.sum 求某属性的合计 
示例: 
   1: Session session = SessionFactory.getCurrentSession(); 
   2: User user = null; 
   3: Transaction ts = session.beginTransaction(); 
   4: try { 
   5:     Criteria criteria = session.createCriteria(User.class); 
   6:     criteria.add(Restrictions.eq("name","ijse")); 
   7:     user= (User) criteria.list().get(0);    
   8:     session.commit(); 
   9: } catch (HibernateException ex) { 
  10:     ts.rollBack(); 
  11:     ex.printStackTrace(); 
  12: } 
  13: System.out.println(user.getName()); 
QBE(Query By Example)查询方式 
将一个对象的非空属性作为查询条件进行查询。 
示例: 
   1: Session session = SessionFactory.getCurrentSession(); 
   2: User user = new User(); 
   3: user.setName("ijse"); 
   4: Transaction ts = session.beginTransaction(); 
   5: try { 
   6:     Criteria criteria = session.createCriteria(User.class); 
   7:     criteria.add(Example.create(user)); 
   8:     user= (User) criteria.list().get(0);    
   9:     session.commit(); 
  10: } catch (HibernateException ex) { 
  11:     ts.rollBack(); 
  12:     ex.printStackTrace(); 
  13: } 
  14: System.out.println(user.getName()); 
QBC离线查询 
离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。 
示例: 
   1: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class); 
   2: detachedCriteria.add(Restrictions.eq("name","ijse"); 
   3:  
   4: Session session = SessionFactory.getCurrentSession(); 
   5: User user = new User(); 
   6: Transaction ts = session.beginTransaction(); 
   7: try { 
   8:     Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
   9:     user= (User) criteria.list().get(0);    
  10:     session.commit(); 
  11: } catch (HibernateException ex) { 
  12:     ts.rollBack(); 
  13:     ex.printStackTrace(); 
  14: } 
  15: System.out.println(user.getName()); 
QBC复合查询 
复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。 
示例: 
   1: Session session = SessionFactory.getCurrentSession(); 
   2: User user = new 
   3: User(); 
   4: Transaction ts = session.beginTransaction(); 
   5: try 
   6: { 
   7:  Criteria criteria1 = 
   8: session.createCriteria(Room.class); 
   9: Criteria 
  10: criteria2 =criterial1.createCriteria("User"); 
  11:  
  12: criteria2.add(Restrictions.eq("name",new String("ijse")); 
  13:  
  14: user= (User) criteria.list().get(0); 
  15:  
  16: session.commit(); 
  17: } catch (HibernateException ex) { 
  18:  
  19: ts.rollBack(); 
  20:  
  21: ex.printStackTrace(); 
  22: } 
  23: System.out.println(user.getName()); 
QBC分页查询 
分页查询主要是要指定两个参数:从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。 
示例: 
   1: Session session = SessionFactory.getCurrentSession(); 
   2: List userList = null; 
   3: Transaction ts = session.beginTransaction(); 
   4: try { 
   5:     Criteria criteria = session.createCriteria(User.class); 
   6:     criteria.setFirstResult(0);//从第一个数据开始 
   7:     criteria.setMaxResults(10);//取10条记录 
   8:     userList = (List) criterial.list();   
   9:     session.commit(); 
  10: } catch (HibernateException ex) { 
  11:     ts.rollBack(); 
  12:     ex.printStackTrace(); 
  13: } 

从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example)

猜你喜欢

转载自oma1989.iteye.com/blog/1404171
今日推荐