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());
      }
     }

    }

  • 相关阅读:
    vue中使用v-bind="$attrs"和v-on="$listeners"进行多层组件监听
    钉钉小程序开发遇到的坑
    promise、async、await、settimeout异步原理与执行顺序
    js获取url参数值的几种方式
    ES6解构赋值
    2019年前端面试题
    浏览器兼容问题踩坑收集
    react+antd分页 实现分页及页面刷新时回到刷新前的page
    无侵入埋点
    CSS学习笔记(三)空白符和换行
  • 原文地址:https://www.cnblogs.com/moonfans/p/2959349.html
Copyright © 2011-2022 走看看