hql查询结果的处理

 1、单表查询

 //1、创建一个Query对象  
            //参数:需要执行的hql语句  
            String hql = "select e from Employee e where id = 1";  
            Query query = session.createQuery(hql);  
            //2、执行查询  
            //2、1封装所有  
            List<Employee> emp = query.list();  
            for(Employee e : emp){  
                System.out.println(e);  
  }  

//2、2 封装一个(第一个)  
            Employee empl = (Employee)query.uniqueResult();  
            System.out.println(empl);

*  1)单表查询  
//       1.1 全表查询  
//            String hql = "from star.july.d_hql.Employee";    
//          String hql = "select e from Employee e";  
              
//       1.2 指定字段查询  
            //返回对象数组  
//          String hql = "select e.name,e.title from Employee e";  
              
//       1.3 排除重复记录  
//          String hql = "select distinct(e.gender) from Employee e";  
              
//       1.4 条件查询(重点)(where)  
            //逻辑条件:and  or  
            // 模糊查询:like: % _  
            //比较查询: < > <= >= between and <>  
            //判空查询: is null ,is not null, ='',<>'';  
//          String hql = "select e from Employee e where name like '张%'";  
//          String hql = "select e from Employee e where e.gender is null or e.gender=''";  
              
//       1.5 分页查询  
          String hql = "from Employee "; 
            Query query = session.createQuery(hql); 
            //设置开始读取行 
            query.setFirstResult(0); 
            //每页读取多少条信息 
            query.setMaxResults(3);
              
//        1.6 聚合查询  
            //avg,count,max,min,uniqueResult  
//          String hql = "select max(e.salary) from Employee e";  
              
//        1.7 查询排序  
            //order by  
            //desc:降序  asc:升序  
//          String hql = "select e from Employee e order by id desc ";  
              
              
//        1.8 分组查询  
//          String hql = "select e from Employee e group by e.gender";  
          
//        1.9 分组后筛选  
            String hql = "select e from Employee e  where e.gender is not null and e.gender<>'' group by e.gender having count(e.gender)>1";  
              
            Query query = session.createQuery(hql); 


  //集合对象  
            List<Object> e = query.list();  
            for(Object emp : e){  
                System.out.println(emp);  
            }  

            //对象数组  
         List<Object[]> objects = query.list(); 
            for(Object[] object : objects){ 
                for(Object obj:object ){ 
                System.out.print(obj); 
                } 
                System.out.println(); 
            } 

    //封装一个对象  
            Object unique = query.uniqueResult(); 
            System.out.println(unique);     

2、多表查询

    //多表查询  
        @Test  
        public void test2(){  
            Session session = HibernateUtil.getSession();  
            Transaction ts = session.getTransaction();  
            try{  
                ts.begin();  
                  
                /** 
                 *步骤 
                 *1、确定查询哪些对象 
                 *2、确定查询哪些属性 
                 *3、确定连接条件 
                 *4、业务条件  
                 */  
                //1、内连接查询  
                //效果:只有满足条件的数据才会被显示出来  
                //查询员工及其部门:显示员工名称,部门名称  
//              String hql = "select e.name,d.deptName from Employee e , Dept d where e.dept.id=d.id";  
                //另一种写法  
//              String hql = "select e.name,d.deptName from Employee e inner join e.dept d";  
                  
                  
                //左外连接  
                //效果:优先显示左表,右表的数据匹配显示,不匹配则显示null  
                //查询所有部门的员工(没有员工的部门也要显示出来)  
                String hql = "select d.deptName, e.name from Dept d left outer join d.employee e";  
                  
                //右外连接  
//              String hql = "select d.deptName,e.name from Employee e right outer join e.dept d";  
                Query query = session.createQuery(hql);  
                  
                /*List<Object>  object = query.list(); 
                for(Object obj:object){ 
                    System.out.println(obj); 
                }*/  
                  
                List<Object[]> objects = query.list();  
                for(Object[] object:objects){  
                    for(Object obj : object){  
                        System.out.print(obj);  
                    }  
                    System.out.println();  
                }   
                ts.commit();  
                  
            }catch(Exception e){  
                e.printStackTrace();  
                ts.rollback();  
            }  
        }

 3、实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢?

举个栗子:
现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有多个商品,而一个商品只能对应一个用户。
users表中的字段:userId,userName,telephone,address
goods表中的字段:goodsId,goodsName,userId
现在要实现两表连接查询,查出每个用户所拥有的商品,并把该用户的信息和其商品信息显示出来。
使用Hibernate反向生成的实体类分别是Users和Goods。
有两种方式:
(1)使用传统方式:
String hql="select u.userName, u.telephone, u.address, g.goodsName from Users u, Goods g where u.userId=g.userId";

根据这个查询语句,调用query.list()方法得到一个List值,这个List中的每一个值都是Object[]类型的,里面包含了查询出来的所有值,剩下的自个儿去处理就行了

例如:需要将查询的结果集 进行一下转换:

List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集
   if(stuList != null && stuList.size()>0){
    list = new LinkedList();
    StudentScore st;
    for(int i = 0; i < stuList.size();i++){
     st = new StudentScore();
     Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组
     String userId =  (String)object[0];
     String username =  (String)object[1];
     String truename =  (String)object[2];
     String sex =  (String)object[3];
     String idnum =  (String)object[4];
     String level =  (String)object[5];
     Double sumScore =  Double.parseDouble(String.valueOf(object[6]));
     String paperId =  (String)object[7];
     // 重新封装在一个javabean里面
     st.setUserId(userId);
     st.setUsername(username);
     st.setTruename(truename);
     st.setIdnum(idnum);
     st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));
     st.setSex(DictSwitch.getValue("DICT_SEX",sex));
     st.setPaperId(paperId);
     st.setSumScore(sumScore);
     st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));
     list.add(st); // 最终封装在list中 传到前台。
    }

(2)增加一个映射类

增加一个映射类UsersVoGoods.java,添加需要查询的信息相关的所有属性,本例中添加userName, telephone, address, goodsName。并为这几个属性添加setter和getter方法,增加构造函数,参数与这四个属性对应,那么可以用hql查询方式:

String hql = "select new com.test.UsersVoGoods(u.userName, u.teltphone, u.address, g.goodsName) from Users u, Goods g where u.userId=g.userId";

query.list()的返回值List中的值都是UsersVoGoods型的,直接使用get()就能获取。

其实不增加映射类也是可以的,只需要在Users.java实体类里增加一个构造函数,函数参数还是需要的所有字段,并为这些参数中Users实体原来没有的字段添加属性和getter() setter()即可。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值