zoukankan      html  css  js  c++  java
  • HQL的使用详解

    package com.inspur.test;

    import java.util.Iterator;
    import java.util.List;

    import org.hibernate.Criteria;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.criterion.Expression;

    import com.inspur.po.TAddress;
    import com.inspur.po.TUser;

    import junit.framework.TestCase;

    public class HqlTest extends TestCase {
     Session session=null;

     @Override
     protected void setUp() throws Exception {
      Configuration config=new Configuration().configure();
      SessionFactory sessionFactory=config.buildSessionFactory();
      session=sessionFactory.openSession();
     }

     @Override
     protected void tearDown() throws Exception {
      session.close();
     }
     //目的是获得对象的部分属性,不用全部加载获取对象,可以只捕获其属性即可,
     //如果使用criteria则load上来的是全部的对象,从对象中在获得属性,增加了系统负担。
     public void testProperty(){
      String hql="select user.name from TUser user";
      List list=session.createQuery(hql).list();//返回的list中的每一个条目保存的是一个string类型的字符串而不是TUser类对象。
      Iterator it=list.iterator();
      while(it.hasNext()){
       System.out.println(it.next());
      }
      
     }
     //多属性的获取后返回的list中每一个条目保存是一个object[]类型的对象数组,
     //数组中的元素是对应hql中的属性的顺序
     public void testMulProperties(){
      String hql="select user.name,user.age from TUser user";
      List list=session.createQuery(hql).list();
      Iterator it=list.iterator();
      while(it.hasNext()){
       Object[]result=(Object[])it.next();
       System.out.println(result[0]+" "+result[1]);
      }
     }
     public void testCompute(){
      String hql="select count(*),min(user.age) from TUser user";
      List list=session.createQuery(hql).list();
      Iterator it=list.iterator();
      System.out.println("====test compute function====");
      while(it.hasNext()){
       Object[]result=(Object[])it.next();
       System.out.println(result[0]+" "+result[1] );
      }
     }
     public void testSave(){
      Transaction tran=null;
      TUser user=null;
      String hql="from TUser user where user.name='liuzhq'";
      Query query=session.createQuery(hql);
      List list=query.list();
      Iterator it=list.iterator();
      tran=session.beginTransaction();
      while(it.hasNext()){
       
       user=(TUser)it.next();
       user.setAge(24);
       session.save(user);
       tran.commit();
       System.out.println("save successfully");
       
      }
      
     }
    // public void testSaveCriteria(){
    //  Transaction tran=null;
    //  tran=session.beginTransaction();
    //  TUser user=null;
    //  Criteria criteria=session.createCriteria(TUser.class);
    //  criteria.add(Expression.eq("name", "liuzhq"));
    //  List list=criteria.list();
    //  Iterator it=list.iterator();
    //  while(it.hasNext()){
    //   user=(TUser)it.next();
    //   user.setName("liuzhiqiang");
    //   session.save(user);
    //   tran.commit();
    //   
    //  }
    //  
    //  
    // }
     public void testUpdate(){
      Transaction tran=null;
      tran=session.beginTransaction();
      String hql="update TUser user set user.age=18 where user.name='liuzhiqiang'";
      Query query=session.createQuery(hql);
      query.executeUpdate();
      tran.commit();
      
      
     }
    // public void testDelete(){
    //  Transaction tran=null;
    //  tran=session.beginTransaction();
    //  String hql="delete TUser user where user.age=18";
    //  Query query=session.createQuery(hql);
    //  query.executeUpdate();
    //  tran.commit();
    //  
    // }
     //group by 和order by字句的使用,order by字句必须在整个hql语句的末尾,否则产出错误输出
     public void testGroup(){
      String hql="select user.age,count(*)from TUser user  group by user.age having count(*)>? order by user.age desc";
      Query query=session.createQuery(hql);
      query.setInteger(0, 1);
      List list=query.list();
      Iterator it=list.iterator();
      System.out.println("group by");
      while(it.hasNext()){
       Object[]result=(Object[])it.next();
       System.out.println(result[0]+" "+result[1]);
      }
     }
     //通过query接口进行参数填充,使用占位符相对于引用参数绑定和javabean参数绑定而言是最佳的参数绑定方式。
     public void testzhan(){
      String hql="from TUser user where user.name=? and user.age=?";
      Query query=session.createQuery(hql);
      query.setString(0, "liuzhiqiang");
      query.setInteger(1, 18);
      List list=query.list();
      Iterator it=list.iterator();
      while(it.hasNext()){
       TUser user=(TUser)it.next();
       System.out.println(user.getId());
      }
     }
     //外联查询中一定要添加fetch关键字否则生产的被动关联对象不会填充到主动关联对象的set中,只能
     //在返回的结果集中作为单独的对象存在,这样就不能通过主动对象访问到其关联的被动对象。
     //外联返回的list中包含条目是按照数据库中生成的记录数目相对应的,所有记录数生成对应的对象。
     public void testOutjoin(){
      TUser user=null;
      TAddress address=null;
      String hq1="from  TUser user left join fetch user.TAddresses";
      Query query=session.createQuery(hq1);
      List list=query.list();
      Iterator it=list.iterator();
      Iterator addit=null;
      while(it.hasNext()){
       user=(TUser)it.next();
       System.out.println(user.getName());
       System.out.println("=============");
       addit=user.getTAddresses().iterator();
       while(addit.hasNext()){
        address=(TAddress)addit.next();
        System.out.println(address.getAddress());
        
       }
       
       
      }
     }
     //不使用fetch关键字时返回的list中 的条目是TUser类对象和与其关联的被控对象TAddress类对象组成的object[]对象数组。
     public void testOutFetch(){
      TUser user=null;
      TAddress address=null;
      String hq1="from  TUser user left join  user.TAddresses";
      Query query=session.createQuery(hq1);
      List list=query.list();
      Iterator it=list.iterator();
      Iterator addit=null;
      while(it.hasNext()){
       Object[]result=(Object[])it.next();
       for(int i=0;i<result.length;i++){
        System.out.println(result[i]);
       }
       
       
       
      }
     }
     //测试子查询,hql中的子查询区别于sql中的子查询,如下所示为相关子查询。使用中要注意区别相关,非相关子查询。
     public void testSub(){
      String hql="from TUser user where (select count(*) from user.TAddresses)>1";
      Query query=session.createQuery(hql);
      List list=query.list();
      Iterator it=list.iterator();
      while(it.hasNext()){
       TUser user=(TUser)it.next();
       System.out.println(user.getName());
      }
     }

    }

  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/moonfans/p/2959349.html
Copyright © 2011-2022 走看看