有关Criteria HQL的用法集结(接我前面的例子)

 下面是有关Criteria  HQL的用法集结

首先提几点注意事项:
          为了能夠重複使用Criteria物件,在Hibernate 3中新增了DetchedCriteria,可以
    先建立DetchedCriteria實例,並加入各種查詢條件,並於需要查詢時再與Session綁定,
    获得一個綁定Session的Criteria物件
            HQL本身不區分大小寫,不過要注意類的名稱必須區分大小寫
            Hibernate 3的映射文件中新增了<sql-insert>、<sql-update>與<sql-delete>三個標籤,
   您可以在這三個標籤中使用SQL自定義您的INSERT、UPDATE、DELETE,也就是儲存、更新、刪除
   資料時的行為

 

//*******************************                             ***********************************
    //*******************************     Criteria                ***********************************
    //*******************************                             ***********************************
 //回家后补充,注意3后面的0是一个对结果排序的方法
 public static void testAllCriteria()
 {
      
  
  Session session =util.HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
  
  Criteria criteria = session.createCriteria(User.class);
  // 1
  //criteria.add(Restrictions.or(
        //           Restrictions.eq("id", 1),
        //           Restrictions.eq("name", "111")
        //       ));
  
  // 2  注意这个alias不需要改动
  //criteria.add(Restrictions.sqlRestriction("{alias}.name LIKE (?)", "11%", Hibernate.STRING));


       // 3   Between....and....
  //Integer[] ages = {new Integer(0), new Integer(8)};
  //Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
  //criteria.add(Restrictions.sqlRestriction("{alias}.id BETWEEN (?) AND (?)", ages, types));
  
   // 0  对结果排序,使用Oder.asc()由小到大排序,
   // 注意是针对类的成员变量而不是表格字段
  //criteria.addOrder(Order.desc("id"));

  
  /* 4   以下可以实现分页功能
  int data_count=1;
  criteria.setFirstResult(data_count);
        criteria.setMaxResults(1);

  
  while(true)
  {
   List userss = criteria.list();
   if(userss==null)
    break;
   Iterator its=userss.iterator();
   
   while(its.hasNext())
   {
    System.out.println("第"+(data_count++)+"批数据: ");
    User temp=(User)its.next();
    System.out.print(temp.getId()+"----->");
    System.out.print(temp.getName()+"------>");
    System.out.println(temp.getRoom().getAddress());
    criteria.setFirstResult(data_count);
   }
  }
           
  */
  
  // 5 统计 Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法
  // 5.1分组 ,这里的iterator存储的是每一个不同的name值
  //criteria.setProjection(Projections.groupProperty("name"));
  // 5.2平均值 ,这里的iterator存储的是平均值的大小,注意只有一个值
  //criteria.setProjection(Projections.avg("id"));

  //List users = criteria.list();
  //Iterator iterator =  users.iterator();
  //while(iterator.hasNext()) {
  // System.out.println(iterator.next());      
  //}


  //5.3  统计分组的结合
  //每一中不同的姓名有几个元素
  /*
  ProjectionList projectionList = Projections.projectionList();
  projectionList.add(Projections.groupProperty("name"));
  projectionList.add(Projections.rowCount());//此组中有几行
  
  criteria.setProjection(projectionList);
  List users = criteria.list();
  Iterator iterator =  users.iterator();
  while(iterator.hasNext()) {
   Object[] o = (Object[]) iterator.next();
   System.out.println(o[0] + "/t" + o[1]);
  }
  */
  
  // 6 根据一个已知部分属性的对象来查询
  /*
  User user = new User();
  user.setName(new String("111"));
  user.setId(new Integer(6));//但是这里好像忽略id值了

  
  criteria.add(Example.create(user));

  List users = criteria.list();
  Iterator it=  users.iterator();
  while(it.hasNext())
   {
    
    User temp=(User)it.next();
    System.out.print(temp.getId()+"----->");
    System.out.print(temp.getName()+"------>");
    System.out.println(temp.getRoom().getAddress());
    
   }

  */
  

  //7 如何进行一对多的複合查詢
  /*
  Criteria userCriteria = session.createCriteria(User.class);
  Criteria roomCriteria = userCriteria.createCriteria("room");
  roomCriteria.add(Restrictions.eq("id", new Integer(7)));
  List users = userCriteria.list(); // 只列出users屬性中有user之"age"為30的Room
  Iterator it = users.iterator();
  while(it.hasNext())
   {
    
    User temp=(User)it.next();
    System.out.print(temp.getId()+"----->");
    System.out.print(temp.getName()+"------>");
    System.out.println(temp.getRoom().getAddress());
    
   }
  */

 


       
  
  List users = criteria.list();
  
    
  Iterator it=users.iterator();
  while(it.hasNext())
  {
   User temp=(User)it.next();
   System.out.print(temp.getName()+"--------->");
   System.out.println(temp.getRoom().getAddress());
  }
  

  tx.commit();
  util.HibernateUtil.getSessionFactory().close();
 }


 ///
 //
 ///
 //*******************************                             ***********************************
    //*******************************     DetachedCriteria        ***********************************
    //*******************************                             ***********************************
 private static void testDetachedCriteria()
 {
  Session session =util.HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();


  // 先建立DetchedCriteria物件
  DetachedCriteria detchedCriteria = DetachedCriteria.forClass(User.class);
  // 加入查詢條件
  detchedCriteria.add(Restrictions.ge("name",new String("111")));
    
  
  // 綁定Session並返回一個Criteria實例
  Criteria criteria = detchedCriteria.getExecutableCriteria(session);
    
  List users = criteria.list();
  Iterator it =  users.iterator();
  while(it.hasNext())
  {
   User temp=(User)it.next();
   System.out.print(temp.getName()+"--------->");
   System.out.println(temp.getRoom().getAddress());
  }

  tx.commit();
  util.HibernateUtil.getSessionFactory().close();

 }
 ///
 //
 ///
 //*******************************                             ***********************************
    //*******************************            HQL              ***********************************
    //*******************************                             ***********************************
 public static void testHQL()
 {
  Session session =util.HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
  // 1  命名参数法1.1 注意from后面的是类名,也可带上包名
  //Query query = session.createQuery("select user.name from User as user where user.id > ?");
  //query.setInteger(0, 7);
  // 1  命名参数法1.2
  //Query query = session.createQuery("select distinct user.name from User as user where user.id > :minId");
  //query.setInteger("minId", 7);

  /*List names = query.list();
  if(names!=null)
  {
   Iterator iterator =  names.iterator();
   while(iterator.hasNext()) {
    System.out.println("**********************"+iterator.next());
   }
  }
  */
  

  //2 命名参数法 等值条件 没有 select *关键字
  // 查詢指定类對應表格的所有資料
  /*
  Query query1 = session.createQuery("from User user where user.name like ?");
  //或者用Query query1 = session.createQuery("from User user where user.name='lll'");
  query1.setParameter(0, "111");
        List users = query1.list();
  if(users!=null)
  {
   Iterator it =  users.iterator();
   while(it.hasNext())
   {
    User temp=(User)it.next();
    System.out.println("***************");
    System.out.print(temp.getName()+"---------");
    System.out.println(temp.getRoom().getAddress());     
   }
  }
  */
  // 3 命名参数法 在User;映射文件中申明的方法
  /*
  Query query = session.getNamedQuery("src.QueryUser");
  query.setParameter(0, 6);
        List users = query.list();
  if(users!=null)
  {
   Iterator it =  users.iterator();
   while(it.hasNext())
   {
    User temp=(User)it.next();
    System.out.print(temp.getName()+"---------");
    System.out.println(temp.getRoom().getAddress());     
   }
  }
  */

  // 4  查询两个以上属性
  /*
  Query query = session.createQuery("select user.id, user.name from User as user");

  List names = query.list();
  Iterator iterator =  names.iterator();
  while(iterator.hasNext()) {
   Object[] obj = (Object[]) iterator.next();
   System.out.println(obj[0] + "*********************" + obj[1]);
  }

  */

  // 5  用Query直接返回对象,注意我在User类中多给了一个带两个参数的构造函数
  /*
  Query query = session.createQuery("select new User(user.id, user.name) from User as user");

  List names = query.list();
  Iterator iterator =  names.iterator();
  while(iterator.hasNext()) {
   User user= (User) iterator.next();
   System.out.println(user.getName() + "/t" + user.getId());
  }

  */

  //6  注意继承体系,这里用Object,则Object和它的子类都会被查询
  //   需要了解的是,这里的event目录下person类和Event类也需要数据库中有表
  //因为hibernate.cfg.xml文件中有
  //<mapping resource="events/Event.hbm.xml"/> 和
  //<mapping resource="events/Person.hbm.xml"/>
  /*
  Query query = session.createQuery("from java.lang.Object");
  List users = query.list();
  if(users!=null)
  {
   int num=1;
   Iterator it =  users.iterator();
   while(it.hasNext())
   {
    it.next();
    System.out.print((num++)+"---------");
         
   }
  }
  */
  
  // 7 统计函数
  //Query query = session.createQuery("select count(*) from User as user");
  /*
  Query query = session.createQuery("select avg(user.id) from User as user");

  List names = query.list();
  Iterator iterator =  names.iterator();
  while(iterator.hasNext()) {
   System.out.println(iterator.next());
  }
  */
  
  // 8 其他函数
  /*
  Query query = session.createQuery("select upper(user.name) from User as user");
  List names = query.list();
  Iterator iterator =  names.iterator();
  while(iterator.hasNext()) {
   System.out.println(iterator.next());
  }
  */

  // 9 where字句

  /*
  Query query = session.createQuery("select distinct user.name from User as user where user.id=:minId");
  query.setInteger("minId", 7);

  List names = query.list();
  if(names!=null)
  {
   Iterator iterator =  names.iterator();
   while(iterator.hasNext()) {
    System.out.println("**********************"+iterator.next());
   }
  }
  */

  /* 10 判断是否为空
    between... and...
    in
    like或not like可以讓您進行模糊條件搜尋
    对结果排序
    group by
    group by 結合having子句,例如只將平均大于30的資料分組顯示出來

       
   
  from User user where user.name is not null
  from User user where user.name is null

  from User user where user.age between 20 and 30

  from User user where user.name in('yay', 'yanganyin')

  from User user where user.name like 'yay%'//例如想搜尋名稱中含有yay開頭的資料

  from User user order by user.age desc
  from User user order by user.age
  from User user order by user.age desc, user.name//先按照"age"反序排列,若"age"同,則按"name"順序排列
  
  select user.name, avg(user.id) from User user group by user.name

  select user.name, avg(user.id) from User user group by user.name having avg(user.id) > 30

  */

  // 11 更新或者删除
  /*
  Query query = session.createQuery("update User set name='momor' where name='bbb'");
  query.executeUpdate();

  Query query = session.createQuery("delete User where name='bush'");//这个不是标准SQL
  query.executeUpdate();
  */


  
    
  tx.commit();
  util.HibernateUtil.getSessionFactory().close();
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值