Hibernate 数据查询

一 综述:

 

     Criteria query 通过面向对象化的设计,将数据查询封装为一个对象,可以看作传统sql语句的封装。Criteria只是一

个查询容器,具体的查询条件通过add方法添加到实例中。下面为一个具体的实例。

 

       Criteria criteria = session.createCriteria(Role.class) ;
       
        criteria.add(Expression.eq("role_name" , "duming1")) ;
       
        List list = criteria.list() ;
       
        Iterator iter = list.iterator() ;
       
        while(iter.hasNext()){
           
            Role role = (Role) iter.next() ;
           
            System.out.println("id:" + role.getRole_id());
            System.out.println("name:" + role.getRole_name());
        }

 

二 hql 语句

 

在实际项目中使用最多的是hql查询语句。

1 实体查询

        String hql = "from Role " ;
        Query query = session.createQuery(hql) ;
        List roles = query.list() ;       
        Iterator iter = roles.iterator() ;
       
        while(iter.hasNext()){             
            Role role = (Role) iter.next() ;
            System.out.println("id:" + role.getRole_id());
            System.out.println("name:" + role.getRole_name());           
        }

 

     注意: from Role , Role是一个vo类,而不是一个存在的数据库中的table 。

 

 (2) 关于继承

 

       如果查询Base类,而SubA ,和SubB都是Base的子类。那么查询Base,结果就会出现SubA 和SubB的信息。

  显然如果查询java.lang.Object 。那么就会查询出所有类的信息。

 

 

(3)条件查询语句

 

    String hql = "from Role as role where role.role_name ='duming1'" ;
        Query query = session.createQuery(hql) ;
        List roles = query.list() ;
       
        Iterator iter = roles.iterator() ;
       
        while(iter.hasNext()){
            Role role = (Role) iter.next() ;
            System.out.println("role_id" + role.getRole_id());
            System.out.println("role_name:"+ role.getRole_name());
           
        }

 

(4)  查询某一个单独属性

 

String hql = "select role.role_name from Role role"  ;
        Query query = session.createQuery(hql) ;
        List roles = query.list() ;

 

      数组中的每个元素都是String的

 

        Iterator iter = roles.iterator() ;       
        while(iter.hasNext()){
            String role = (String) iter.next() ;

            System.out.println("role_id" + role);       
        }   

 

 

(5) 若获取多个属性

 

        String hql = "select role.role_name , role_id from Role role"  ;
        Query query = session.createQuery(hql) ;
        List roles = query.list() ;       
        Iterator iter = roles.iterator() ;       
        while(iter.hasNext()){
            Object[] results   =  (Object[])iter.next() ;

           容器中得到的是 对象数组

 

            System.out.println(results[0]);
            System.out.println(results[1]);
        }

 

 (6)对获取多个属性进行封装

 

      String hql = "select new Role (  role_id , role.role_name ) from Role role"  ;

       //上面的Role对查询的数据进行了封装 ,但是在vo类中,必须有相关的构造函数

 

        Query query = session.createQuery(hql) ;
        List roles = query.list() ;       
        Iterator iter = roles.iterator() ;       
        while(iter.hasNext()){
            Role result   =  (Role)iter.next() ;

            System.out.println(result.getRole_id());
            System.out.println(result.getRole_name());
        }       

 

 

 

 

 2 实体的查询和更新

       (1) 关于实体类的更新

 

        Transaction tc = session.beginTransaction() ; 
        String hql = "update Role set role_name = 'duming' where role_id = 1" ;
        Query query = session.createQuery(hql) ;
        query.executeUpdate() ;       
        tc.commit() ;

 

        (2) 关于实体类的删除

 

        Transaction tc = session.beginTransaction() ;       
        String hql = "delete Role where role_id = 1" ;
        Query query = session.createQuery(hql) ;
        query.executeUpdate() ;       
        tc.commit() ;

 

 

3 分组与排序

      同sql种的方式一样,无需解释

 

 

4 参数绑定

      即要求查询的参数为变量。

 

      (1)通过"?"占位符

         String hql = "from Role role where role.role_id = ?" ;
        Query query = session.createQuery(hql) ;
        query.setInteger(0, 1) ;
        List roles = query.list() ;
       
        Iterator iter = roles.iterator() ;
        while(iter.hasNext()){    
            Role result = (Role) iter.next() ;
            System.out.println("name" + result.getRole_name() );     
        }

 

      (2) 通过引用占位符

 

             String hql = "from Role  where role_name =:name" ;

                  //此处为引用占位符
        Query query = session.createQuery(hql) ;
        query.setParameter("name", "duming2") ;

 

        List roles = query.list() ;       
        Iterator iter = roles.iterator() ;
        while(iter.hasNext()){           
            Role result = (Role) iter.next() ;           
            System.out.println("id" + result.getRole_id() );                               
        }

 

5  联合查询

    (1) 内联查询

           内联返回所有满足关联条件的组合

String hql = "from Role role inner join fetch role.groups" ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role result = (Role) iter.next() ;
System.out.println("id" + result.getRole_id() );
Set <Gr> groups = result.getGroups() ;
Iterator iter1 = groups.iterator() ;

while(iter1.hasNext()){
Gr gr = (Gr)iter1.next() ;
System.out.println("" + gr.getGroup_name() );
}
}

 

    如果忽略了fetch,那么返回的值,为一个Object[] 数组,

 

 (2)  左外联查询

 

    String hql = "from Role role left join fetch role.groups" ;

 

    包含了左侧表的全部信息,右边的信息若不存在则为空, 即NULL。

 (3) 右外联查询

 

    和左外联相反。

 

(4) 子查询

 

   from Role role where (select count(*) from role.groups) > 2

 

 

   (5) 数据加载方式

 

       a )即时加载

            当实体加载完毕后立即加载相关数据

 

       b) 延迟加载

          实体加载后,有关数据并不是立即获取,而是关联数据第一次访问后才进行加载。

 

      c) 预先加载

           实体与相关联数据同时读取,实体与相关联的数据通过outer join  语句相联系。

 

       d) 批量加载

           对即时加载和延迟加载可以采用批量加载进行优化。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值