`
sungang_1120
  • 浏览: 310060 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Hibernate 的HQL,QBC 查询语言

阅读更多

1.HQL:(Hibernate Query Language) 是面向对象的查询语言 

1.实体查询 

public void testQueryAllDept(){  
String hql="from Employee";  
       //hql="from com.sh.Entity";  
Query query=session.createQuery(hql);  
  
List<Employee> list= query.list();  
  
//...  
} 
 



2.有条件的 实体查询 

    public void testQueryAllDept(){  
    String hql="from Deptas model where mode.deptName='人事部' ";  
           //hql="from com.sh.Entity";  
    Query query=session.createQuery(hql);  
      
    List<Employee> list= query.list();  
      
    //...  
    }  
    public void testQueryAllDept(){  
    String hql="from Deptas model where mode.deptName like '%部%' ";  
           //hql="from com.sh.Entity";  
    Query query=session.createQuery(hql);  
      
    List<Employee> list= query.list();  
      
    //...  
    }  
      
     public void testQueryDeptByGt(){  
      
     String hql="from Dept model where model.createDate> '2012-03-10'";  
     Query query=session.createQuery(hql);  
     List<Employee> list= query.list();  
     }  
 




3.HQL 中的各种运算符 

运算符类型 HQL运算符 含义
比较运算 = 等于
  <> 不等于
  > 大于
  >= 大于等于
  <= 小于等于
  < 小于
  is null 为空
  is not null 不为空
范围运算 in 等于列表中的某一值
  not in 不等于列表中的任意一个值
  between  p1 and p2 大于等于值1  且 小于等于值2
  not between p1 and p2 小于值1 或者 大于 值2
字符串模式匹配 like 字符串模式匹配
逻辑运算 and
  or
  not



3.更新 删除 

    public void testModifyDate(){  
            Transaction tr=session.beginTransaction();  
            Dept detp=(Dept)session.get(Detp.class,new Integer(6));  
            detp.seteCreateDate("2000-03-10");  
            tr.commit();  
              
        }  
      
    // delete  删除  
    public void testDelDeptByHql(){  
            Transaction tr=session.beginTransaction();  
            String hql="delete Dept as model where model.deptId=6";  
            Query query=session.createQuery(hql);  
            query.executeUpdate();  
            tr.commit();  
        }  
 


4.属性查询 

    public void testQueryDeptName(){  
        String hql="select model.deptName from Dept as model";  
        Query query=session.createQuery(hql);  
        List<String> deptNameList=query.list();  
        //...  
    }  
           public void testQueryDeptName(){  
        String hql="select model.deptName,model.createDate from Dept as model";  
        Query query=session.createQuery(hql);  
        List<Object[]> prsList=query.list();  
                   for(){  
                   }                 
        //...  
    }  
          
       //采用对象进行 保存 查询的字段(要添加 对应字段的构造方法)  
        public void testQueryDeptName(){  
        String hql="select new Dapt(model.deptName,model.createDate) from Dept as model";  
        Query query=session.createQuery(hql);  
        List<Dept> deptList=query.list();  
                   for(Dept d:deptList){  
                      
                      d.setDeptName("test");  
                      session.saveOrUpdate(dept);  
                   }                 
        //...  
    }  
      
          
       //如果采用对象 保存上面查询出来的对象  如果对其进行更新的操作 是不会成功的  
      
    public void testSaveDept(){  
        Transction  tr=session.beginTransactino();  
        String hql="select new Dept(model.deptName,model.createDate) from Dept as model";  
        Query query=session.createQuery();  
        List<Dept> deptList=query.list();  
        for(Dept dept:deptList){  
            System.out.println(dept.deptName);  
            dept.setDetpName("test");  
            session.saveOrUpdate(dept);  
        }  
        tr.commit();  
          // 最后 根本就没有更新 而是 在数据库中 插入 新的记录  
    }  
 



5.使用函数 

    public void testQuyeryFunction(){  
            String hql="select count(*),min(model.createDate) from Dept as model";  
            Query query=session.createQuery(hql);  
            List<Object[]> paramsList=query.list();  
            for(){  
                  
            }  
            //...  
        }  
 



6.分组 与 排序 

    //排序  
    public void testQueryOrderBy(){  
            String hql="from Dept as mode order by   model.createDate,model.deptName desc";  
            Query query=session.createQuery();  
            List<Dept> deptList=query.list();  
            for(){}  
            //  
              
        }  
      
    //分组 并且 使用  having 筛选  
    public void testQueryGroupBy(){  
            String hql="select count(model),model.deptName from Dept as model group by model.deptName having count(model)>1";  
            Query query=session.createQuery();  
            List<Object[]> list=query.list();  
            //...  
        }  
 



7.查询单个对象 

    public void testQueryUn(){  
            String hql="select model.deptName from Dept as model where model.deptId=2";  
            Query query=session.createQuery(hql);  
            query.setMaxResults(1);  
            String deptName=(String)query.uniqueResult();  
            System.out.println(deptNamae);  
        }  
 



8.绑定参数 
释义:Hibernate中也采用了preparedStatement作为底层数据库的的访问方式,与之对应的SQL语句 可以重用preparedStatement对象, 首先会预编译,然后缓存起来,提高性能. 

1.使用 ":"加参数名 绑定参数 

    public void  testQueryByParamsName(){  
               //使用  ":参数名" 来传递参数  
        String hql="from Dept as model where   
    odel.deptName=:deptName and model.createDate=:createDate";  
      
        Query query=session.createQuery(hql);  
        query.setString("deptName","test");  
        query.setString("ceateDate","2000-02-10");  
        List<Dept> deptList=query.list();  
        for(){}  
          
        //...  
          
    }  

 
2.使用 "?" 按照位置来绑定参数 

    public void testQueryByParamsID(){  
        String hql="from Dept as model where model.deptName=? and model.createDate=?";  
        Query query=session.createQuery(hql);  
        query.setString(0,"test");  
        query.setString(1,"2000-02-02");  
        List<Dept> list=query.list();  
        for(){}  
        //..  
    }  
 


3.采用setEntity() 将参数和一个持久化对象进行绑定 

    public void testQueryByDept(){  
            Dept dept=(Dept)Session.get(Dept.clas,new Integer(2));  
            String hql="select Employee  as model where model.dept=?"  
            Query query=session.createQuery(hql);  
            query.setEntity(0,dept);  
            List<Employee> empList=query.list();  
            for(){}  
            //..  
              
              
        }  
 


4.setParameter() 用于绑定任意类型的参数 

    public void testQueryBySetParams(){  
            String hql="from Dept as model where model.deptName=?";  
            Query query=session.createQuery(hql);  
            query.setParameter(0,"test");  
            List<Dept> deptList=query.list();  
            for(){}  
            //..  
        }  
 



5.setProperties() 将一个参数名 于一个对象的属性值绑定 

    public void testQueryBySetPro(){  
            Dept deptNew=new  Dept();  
            deptNew.setDeptName("test");  
              
            String hql="from Dept as model where model.deptName=:deptName";  
            Query query=session.createQuery();  
            query.setProperties(deptNew);  
            List<Dept> deptList=query.list();  
            for(){  
                  
            }  
            //..  
              
        }  
 



10. 联合查询 
inner join 

    public void testQueryInnerJoin(){  
            String hql="from Dept as model inner join model1.employees as model2";  
            Query query=session.createQuery(hql);  
            List<Object[]> objList=query.list();  
            for(Object[] obj:objList){  
                Dept dept=(Dept)obj[0];  
                Employee emp=(Employee)obj[1];  
                System.out.println("xxxx");  
            }  
        }  
 


left join 

    public void testQueryLeftJoin(){  
            String hql="from Dept as model left join model1.employees as model2";  
            Query query=session.createQuery(hql);  
            List<Object[]> objList=query.list();  
            for(Object[] obj:objList){  
                Dept dept=(Dept)obj[0];  
                Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断  
                if(mep!=null){  
                    System.out.println("xxxx");  
                }else{  
                    System.out.println(null);  
                }  
                System.out.println(dept.getDeptName());  
            }  
        }  
 


right join 

    public void testQueryRightJoin(){  
        String hql="from Dept as model right join model1.employees as model2";  
        Query query=session.createQuery(hql);  
        List<Object[]> objList=query.list();  
        for(Object[] obj:objList){  
            Dept dept=(Dept)obj[0];  
            Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断  
            if(dept!=null){  
                System.out.println(dept.getDeptName());  
            }else{  
                System.out.println(null);  
            }  
            System.out.println("dd"+emp.getEmployeeName());  
        }  
    }  
 


11.子查询 

    public void testQueryChild(){  
        String hql="from Dept as model where (select count(*) from model.employee) >2";  
        Query query=session.createQuery(hql);  
        List<Dept> objList=query.list();  
        for(){}  
        //..  
    }  
 



12 Criteria 查询 
释义:通过面向对象的设计将数据查询条件封装在一个对象 

    //无条件  
    public void testQueryDept(){  
            Criteria criteria=session.createCriteria(Dept.class);  
            List<Dept> deptList=criteria.list();  
            for(){}  
            //..  
        }  
      
    //添加条件  
    public void testQueryDeptByName(){  
            Criteria criteria=session.createCriteria(Dept.class);  
            criteria.add(Expression.eq("deptName", "人事部"));  
            List<Dept> deptList=criteria.list();  
            for(){}  
            //..  
        }  

 

SQL语法查询机制 

方法 描述
Expression.eq 对应sql中的field =value
Expression.gt 对应sql中的field>value
Expression.ge 对应sql中的field>=value
Expression.lt 对应sql中的field<value
Expression.le 对应sql中的field<=value
Expression.between 对应sql中的between
Expression.like 对应 like
Expression.in 对应 in
Expression.eqProperty 用于比较两个属性之间的值,对应的Sql条件中field=field
Expression.gtProperty 用于比较两个属性之间的值,对Sqlfiled>field
Expression.geProperty 用于比较两个属性之间的值,对应sql field>=field
Expression.ltProperty 用于比较两个属性之间的值,对应field<field
Expression.leProperty 用于比较 两个属性之间的值,对应field<=field




Hibernate3中采用Restrictions类代替Expression 

public void  testQueryDeptByNameRe(){  
        Criteria  criteria=session.createCriteria(Dept.class);  
        criteria.add(Restrictions.eq("deptName", "人事部"));  
        List<Dept> deptList=criteria.list();  
        for(){}  
        //..  
          
    } 

 

 



Criteria中限定返回的行数 

    public void testQueryDept(){  
            Criteria criteria=session.createCriteria(Dept.class);  
            criteria.setFirstResult(2);  
            criteria.setMaxResults(2);  
            List<Dept> deptList=criteria.list();  
            for(){}  
            //..  
        }  
 



Criteria排序 

        public void testQueryDept(){  
                Criteria criteria=session.createCriteria(Dept.class);  
                criteria.addOrder(Order.asc("createDate"));  
                List<Dept> deptList=criteria.list();  
                for(){}  
                //..  
            }  

 转载:http://www.cnblogs.com/jifeng/archive/2013/03/03/2941181.html

分享到:
评论

相关推荐

    HIBERNATE_QUERY

    Hibernate支持强大且易于使用的面向对象查询语言(HQL)。 如果希望通过编程的方式创建查询,Hibernate提供了完善的按条件(Query By Criteria, QBC)以及按样例(Query By Example, QBE)进行Hibernate查询的功能。 你也...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     A.4 DQL数据查询语言  A.4.1 简单查询  A.4.2 连接查询  A.4.3 子查询  A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     A.4 DQL数据查询语言  A.4.1 简单查询  A.4.2 连接查询  A.4.3 子查询  A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     A.4 DQL数据查询语言  A.4.1 简单查询  A.4.2 连接查询  A.4.3 子查询  A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     A.4 DQL数据查询语言  A.4.1 简单查询  A.4.2 连接查询  A.4.3 子查询  A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java...

    hibernate总结

    2. 通过HQL/SQL 检索 hibernate query language (面向对象的查询语言) * a) 不再操纵表,它操纵的是持久化类的对象 b) 面向对象的 3. QBC ( query by criteria ) 更加面向对象 4. QBE ( query by Example ) 5....

    rock-0.9.1开源框架

    4 不支持HQL之类的查询语言,对于复杂查询任务,直接使用sql语言,操作简单,可直接返回对象数据。 5 对于复杂查询任务,sql语句也可以直接放在spring的配置文件中,直接注入到DAO中。 6 不支持对象之间的关联。 7 ...

    rock-0.9开源框架

    4 不支持HQL之类的查询语言,对于复杂查询任务,直接使用sql语言,操作简单,可直接返回对象数据。 5 对于复杂查询任务,sql语句也可以直接放在spring的配置文件中,直接注入到DAO中。 6 不支持对象之间的关联。 7 ...

    低清版 大型门户网站是这样炼成的.pdf

    5.4 qbc查询方式 314 5.4.1 基本查询 315 5.4.2 qbe查询 317 5.4.3 分页查询 318 5.4.4 复合查询 318 5.4.5 离线查询 319 5.5 本地sql查询 320 5.6 hibernate的批量处理 322 5.6.1 批量插入 322 5.6.2 批量...

    Java Web程序设计教程

    9.2hibernate的数据查询方式 193 9.2.1hql方式 193 9.2.2qbc方式 194 9.2.3原生sql方式 195 9.3hibernate的关联查询 196 9.3.1一对一关联关系的使用 196 9.3.2一对多、多对一关联关系的使用 197 9.3.3多对多...

    jdbc基础和参考

    查询对象,HQL Criteria 1.hibernate提供的更面向对象的一种查询方式。 准备工作: 1.java中的POJO对象存在 2.数据库,表得存在 3.hibernate的配置文件(hibernate.cfg.xml)得存在 4.POJO.hbm.xml文件存在 5....

    Java学习笔记-个人整理的

    {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {13.6.1}Wrapper}{199}{subsection.13.6.1} {13.7}DAO}{199}{section.13.7} {13.8}java.util....

Global site tag (gtag.js) - Google Analytics