• Hibernate入门4


    HIbernate的导航查询:

      适用场景:当一张A表关联到另一张B表的多条记录,存在一对多的关系(或者多对多),那么查询A表的记录时,就可以将A表某条记录关联的B表的所有记录查询出来,这种方式,就叫做Hibernate的导航查询(如:一张客户表,一张联系人表,客户表存在一条记录是百度公司的,而在联系人表中对应着多条联系人的记录,而在定义实体类的时候,客户实体类中就进行绑定联系人类用了一个Set进行绑定,因此在查询某个客户的时候,对应的此客户下的联系人Set集合中的数据也就一并查找出来了,这种查询的方式,就叫做导航查询)。

    代码片段:

     1 // Hibernate的对象导航查询
     2     @Test
     3     public void fun1() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11             // 通过id找到对应的数据记录
    12             Customer customer = session.get(Customer.class, "4028db335e71d646015e71d64c8e0000");
    13             Set<LinkMan> sets = customer.getMans();
    14             System.out.println(customer.getCustName()+"的联系人人数为: "+sets.size());
    15             System.out.println("联系人具体的详情:");
    16             for(LinkMan man : sets) {
    17                 System.out.println(man);
    18             }
    19             ts.commit();
    20         } catch (Exception e) {
    21             ts.rollback();
    22             e.printStackTrace();
    23         } finally {
    24             session.close();
    25         }
    26     }
    View Code

    运行截图:

    OID查询:

      oid查询,就是根据id查询记录,调用的是Session的get()方法,这种方式比较简单,代码见下:

    1 // 通过id找到对应的数据记录
    2    Customer customer = session.get(Customer.class, "4028db335e71d646015e71d64c8e0000");

    HIbernate的HQL查询方式:

      HQL:HIbernate Query Language,由HIbernate提供的一种查询语言,HQL语言和普通sql很相似,两者的区别在于:sql操作的是数据库表和表的字段,hql操作的是实体类和实体类的属性。

      使用HQL进行查询操作的步骤(使用Query对象进行操作):

        1. 创建Query对象,写hql语句

        2. 调用query对象里面的方法得到结果

    HQL查询所有代码片段:

     1 /**
     2  * 查询:HQL查询
     3  * 
     4  * @author Geore
     5  * 
     6  */
     7 public class TestDemo6 {
     8     @Test
     9     // 查询所有
    10     public void fun1() {
    11         Transaction ts = null;
    12         Session session = null;
    13         SessionFactory factory = null;
    14         try {
    15             factory = Tools.getSessionFactory();
    16             session = factory.openSession();
    17             ts = session.beginTransaction();
    18 
    19             // 得到Query对象,通过session的createQuery方法(写hql语句)
    20             Query query = session.createQuery("from Customer");
    21             // 得到查询的结果
    22             List<Customer> list = query.list();
    23             for (Customer cust : list) {
    24                 System.out.println(cust.getCustName() + "--"
    25                         + cust.getCustSource() + "--联系人数:"
    26                         + cust.getMans().size());
    27             }
    28 
    29             ts.commit();
    30         } catch (Exception e) {
    31             ts.rollback();
    32             e.printStackTrace();
    33         } finally {
    34             session.close();
    35         }
    36     }
    37 }
    View Code

    HQL查询所有的hql语句: from pojo类

    运行截图:

    HQL的条件查询操作:

     1 @Test
     2     // hql条件查询
     3     public void fun2() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("from Customer where custLevel=?");
    14             // 设置占位符的值
    15             query.setParameter(0, "svip");
    16             // 查询,并得到结果集
    17             List<Customer> list = query.list();
    18             // 便利输出结果集合
    19             for (Customer cust : list) {
    20                 System.out.println(cust.getCustName() + "--"
    21                         + cust.getCustSource() + "--联系人数:"
    22                         + cust.getMans().size());
    23             }
    24             ts.commit();
    25         } catch (Exception e) {
    26             ts.rollback();
    27             e.printStackTrace();
    28         } finally {
    29             session.close();
    30         }
    31     }
    32 -正常条件查询
    View Code-条件查询
     1 @Test
     2     // hql的模糊查询
     3     public void fun3() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("from Customer where custLevel like ?");
    14             // 设置占位符的值
    15             query.setParameter(0, "%sv%");
    16             // 查询,并得到结果集
    17             List<Customer> list = query.list();
    18             // 便利输出结果集合
    19             for (Customer cust : list) {
    20                 System.out.println(cust.getCustName() + "--"
    21                         + cust.getCustSource() + "--联系人数:"
    22                         + cust.getMans().size());
    23             }
    24             ts.commit();
    25         } catch (Exception e) {
    26             ts.rollback();
    27             e.printStackTrace();
    28         } finally {
    29             session.close();
    30         }
    31     }
    View Code-模糊查询

    HQL的条件查询的hql语句:

    1 条件查询: 
    2 FROM 实体类名称 WHERE 实体类属性名称1=? and 实体类属性名称n=?
    3 
    4 模糊查询:
    5 FROM 实体类名称 WHERE 实体类属性名称 LIKE ?

    运行截图:

    HQL的排序查询: 

     排序代码片段:

     1 @Test
     2     // hql的排序查询
     3     public void fun4() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("from LinkMan order by linkName desc");
    14             // 查询,并得到结果集
    15             List<LinkMan> list = query.list();
    16             // 便利输出结果集合
    17             for (LinkMan man : list) {
    18                 System.out.println(man.getLinkName() + " -- " + man.getLid());
    19             }
    20             ts.commit();
    21         } catch (Exception e) {
    22             ts.rollback();
    23             e.printStackTrace();
    24         } finally {
    25             session.close();
    26         }
    27     }
    View Code

    HQL的排序语句写法:

    1 FROM 实体类名称 ORDER BY 实体类属性名称 ASC/DESC

    运行截图(按照字母倒序在排):

     HQL的分页查询:

      在hql操作中,在语句里面不能写limit,hibernate的Query对象中封装了两个方法实现分页操作。

    分页查询代码片段:

     1 @Test
     2     // 分页查询
     3     public void fun5() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("from LinkMan");
    14             // 设置分页查询的起始位置
    15             query.setFirstResult(0);
    16             query.setMaxResults(2);
    17             // 得到查询的结果
    18             List<LinkMan> list = query.list();
    19             for (LinkMan man : list) {
    20                 System.out.println(man.getLid() + " -- " + man.getLinkName());
    21             }
    22 
    23             ts.commit();
    24         } catch (Exception e) {
    25             ts.rollback();
    26             e.printStackTrace();
    27         } finally {
    28             session.close();
    29         }
    30     }
    View Code

    运行截图:

     

    HQL投影查询:

      查询的不是表的所有字段,而是部分字段的值

    代码片段:

     1 @Test
     2     // 投影查询
     3     public void fun6() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("select linkName from LinkMan");
    14             // 得到查询的结果
    15             List<Object> list = query.list();
    16             for (Object man : list) {
    17                 System.out.println(man);
    18             }
    19 
    20             ts.commit();
    21         } catch (Exception e) {
    22             ts.rollback();
    23             e.printStackTrace();
    24         } finally {
    25             session.close();
    26         }
    27     }
    View Code

    投影查询的hql语句 

    1 SELECT 实体类属性名1,实体类属性名2...实体类属性名n FROM 实体类名称(select后不能写*号)

    运行截图:

    HQL的聚集函数的使用:

       在数据库的操作中存在很多的聚合函数,如count,max,min等。同时在hql也提供了聚合函数的支持,和sql的一样。

    count聚集函数代码片段:

     1 @Test
     2     // 聚集函数的使用
     3     public void fun7() {
     4         Transaction ts = null;
     5         Session session = null;
     6         SessionFactory factory = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             ts = session.beginTransaction();
    11 
    12             // 得到Query对象,通过session的createQuery方法(写hql语句)
    13             Query query = session.createQuery("select count(*) from LinkMan");
    14             // 得到查询的结果
    15             Object obj = query.uniqueResult();
    16             System.out.println("t_linkman表有: " + obj + " 条记录。");
    17 
    18             ts.commit();
    19         } catch (Exception e) {
    20             ts.rollback();
    21             e.printStackTrace();
    22         } finally {
    23             session.close();
    24         }
    25     }
    View Code

    运行截图:

    Hibernate的QBC查询:

      使用QBC查询的话,不需要使用HQL语句了,而是通过方法进行实现,QBC查询操作的是实体类和属性,要使用QBC进行查询,那么就必须了解到Criteria类的使用。

    QBC查询所有:

    代码片段:

     1 // 查询所有
     2 @Test
     3     public void fun1() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 得到Criteria
    13             Criteria criteria = session.createCriteria(Customer.class);
    14             // 进行查询,得到Customer的集合结果集
    15             List<Customer> list = criteria.list();
    16             // 遍历输出
    17             for(Customer customer : list) {
    18                 System.out.println(customer.getCid() + " -- " + customer.getCustName());
    19             }
    20             tx.commit();
    21         } catch(Exception e){
    22             tx.rollback();
    23             e.printStackTrace();
    24         } finally {
    25             session.close();
    26         }
    27     }
    View Code

    运行截图:

    QBC的条件查询:

      QBC的条件查询需要进行条件的绑定,而进行条件绑定则需要使用到Criteria类的add()方法,并且在add方法中进行条件绑定,而add方法中则需要传人一个参数,我们只需要在add中使用Restrictions类的静态方法来进行条件绑定即可,Restrictions类的主要的方法,如下:

     

    代码片段: 

     1 @Test
     2     // QBC条件查询,条件查询要使用到一个类:Restrictions,这个类用来绑定条件
     3     public void fun2() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 得到Criteria
    13             Criteria criteria = session.createCriteria(Customer.class);
    14             // 进行条件查询,设置条件值
    15             criteria.add(Restrictions.eq("custName", "Geore"));
    16             // 进行查询得到结果集
    17             List<Customer> list = criteria.list();
    18             // 遍历输出
    19             for(Customer customer : list) {
    20                 System.out.println(customer.getCid() + " -- " + customer.getCustName());
    21             }
    22             tx.commit();
    23         } catch(Exception e){
    24             tx.rollback();
    25             e.printStackTrace();
    26         } finally {
    27             session.close();
    28         }
    29     }
    View Code

    运行截图:

     QBC的排序查询:

      QBC的排序查询:使用Criteria类的addOrder()方法,在addOrder()中需要传入参数Order对象,而Order类有两个方法asc()和desc(),分别对应的就是升序和降序的方法。

    代码片段:

     1 @Test
     2     // QBC排序查询
     3     public void fun3() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 得到Criteria
    13             Criteria criteria = session.createCriteria(Customer.class);
    14             // 进行排序查询
    15             criteria.addOrder(Order.asc("cid"));  // 升序
    16             // criteria.addOrder(Order.desc("")); 降序
    17             // 进行查询得到结果集
    18             List<Customer> list = criteria.list();
    19             // 遍历输出
    20             for(Customer customer : list) {
    21                 System.out.println(customer.getCid() + " -- " + customer.getCustName());
    22             }
    23             tx.commit();
    24         } catch(Exception e){
    25             tx.rollback();
    26             e.printStackTrace();
    27         } finally {
    28             session.close();
    29         }
    30     }
    View Code

    运行截图:

    QBC的分页查询:

      使用两个方法:setFirstResult(0) 设置起始位置 和 setMaxResults(2) 设置每页最大数

    代码片段:

     1 @Test
     2     // QBC分页查询
     3     public void fun4() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 得到Criteria
    13             Criteria criteria = session.createCriteria(Customer.class);
    14             // 进行分页查询
    15             criteria.setFirstResult(0); // 设置起始位置
    16             criteria.setMaxResults(2);    // 设置每页最大数
    17             
    18             // 进行查询得到结果集
    19             List<Customer> list = criteria.list();
    20             // 遍历输出
    21             for(Customer customer : list) {
    22                 System.out.println(customer.getCid() + " -- " + customer.getCustName());
    23             }
    24             tx.commit();
    25         } catch(Exception e){
    26             tx.rollback();
    27             e.printStackTrace();
    28         } finally {
    29             session.close();
    30         }
    31     }
    View Code

    运行截图:

     QBC的聚合函数:

      对于QBC的聚合函数的查询,使用Criteria类的setProjection()方法,在setProjection()方法中使用Projections类调用这个类的方法即可实现聚合函数的查询,Projections的方法如下:

    代码片段:

     1 @Test
     2     // QBC聚合函数
     3     public void fun5() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 得到Criteria
    13             Criteria criteria = session.createCriteria(Customer.class);
    14             // 进行统计查询
    15             criteria.setProjection(Projections.rowCount());
    16             Object obj = criteria.uniqueResult();
    17             System.out.println(obj);
    18             
    19             tx.commit();
    20         } catch(Exception e){
    21             tx.rollback();
    22             e.printStackTrace();
    23         } finally {
    24             session.close();
    25         }
    26     }
    View Code

    运行截图:

     

    QBC的离线查询:

      QBC离线查询使用的是DetachedCriteria类,并使用此类的forClass()静态方法创建这个类的对象,并在最终执行查询的时候,使用Session,得到Criteria。

    代码片段:

     1 @Test
     2     // QBC离线查询
     3     public void fun6() {
     4         SessionFactory factory = null;
     5         Session session = null;
     6         Transaction tx = null;
     7         try {
     8             factory = Tools.getSessionFactory();
     9             session = factory.openSession();
    10             tx = session.beginTransaction();
    11             
    12             // 离线查询使用的是DetachedCriteria类,并使用此类的forClass()静态方法创建这个类的对象
    13             DetachedCriteria dCriteria = DetachedCriteria.forClass(Customer.class);
    14             // 在最终执行查询的时候,使用Session,得到Criteria
    15             Criteria criteria = dCriteria.getExecutableCriteria(session);
    16             // 得到查询的结果集
    17             List<Customer> list = criteria.list();
    18             // 便利输出
    19             for(Customer customer : list) {
    20                 System.out.println(customer.getCid() + " -- " + customer.getCustName());
    21             }
    22             tx.commit();
    23         } catch(Exception e){
    24             tx.rollback();
    25             e.printStackTrace();
    26         } finally {
    27             session.close();
    28         }
    29     }
    View Code

    运行截图:

     

  • 相关阅读:
    nodejs实现端到端加密
    DiffieHellman(迪菲-赫尔曼)密钥交换算法原理及其实现
    MongoDB主备 版本3.6.5
    linux源地址转换
    Mac下IDEA快捷键操作
    Ubuntu离线安装gcc
    VM安装Mac时,使用Unlocker12 插件时报getTools错误的问题
    华为OSPF与ACL综合应用实例讲解
    基于全局地址池的DHCP
    浮动静态路由及负载均衡
  • 原文地址:https://www.cnblogs.com/geore/p/7503554.html
Copyright © 2020-2023  润新知