zoukankan      html  css  js  c++  java
  • Hibernate各种查询操作(一)

    测试数据库如下

    t_sort表:                                   t_good表:

    一、对象导航方式查询

       查询所有食品类下面的食品

      代码:

      

    //对象导航查询
        @Test
        
        public void Test1(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、使用get方法查询出食品类
                Sort food = session.get(Sort.class, 1);
                //2、使用sort对象的方法得到所有食品类中的食品
                Set<Good> set = food.getSetGoods();
                //3、遍历set集合
                for (Good good : set) {
                    System.out.println(good);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            }finally{
                session.close();
                sessionFactory.close();
            }
        }

      查询结果:

    二、OID查询

      OID查询就是根据id查询某一条记录

      代码

    //OID查询方式
            @Test
            
            public void Test2(){
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    //OID查询就是使用get方法查询出一条记录
                    Sort food = session.get(Sort.class, 1);
                    System.out.println(food);
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                }finally{
                    session.close();
                    sessionFactory.close();
                }
            }

      结果

        

    三、HQL查询

      hql查询是使用Hibernate Query Language进行的一种查询方式,在这种查询方式中必须要写hql语句才能查询。

    1、查询所有

      查询所有的hql语句格式为:from 实体类名称(以查询所有商品为例)

        代码:

    // HQL查询所有。查询所有商品为例
        @Test
        public void Test3() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1、得到Query对象,并写入hql语句
                Query query = session.createQuery("from Good");
                //2、使用Query对象的list方法得到数据集合
                List<Good> list = query.list();
                //3、遍历集合获取数据
                for (Good good : list) {
                    System.out.println(good);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }

      测试结果:

      

    2、条件查询

      条件查询有准确查询和模糊查询,使用hql语句完成。

      (1)准确查询hql语句:from 实体类名 where 实体属性名 = ? and 实体类属性名 = ?。

      准确查询代码: 

    // HQL准确条件查询。查询名字为面包,描述为奶油面包的记录
            @Test
            public void Test4() {
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    // 1、得到Query对象,并写入hql语句
                    Query query = session.createQuery("from Good where gname = ? and gmono =?");
                    //2、填写上一步中占位符的内容
                    query.setParameter(0, "面包");
                    query.setParameter(1, "奶油面包");
                    //3、使用Query对象的list方法得到数据集合
                    List<Good> list = query.list();
                    //3、遍历集合获取数据
                    for (Good good : list) {
                        System.out.println(good);
                    }
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                } finally {
                    session.close();
                    sessionFactory.close();
                }
            }

      查询结果:

        

      (2)模糊查询hql语句:from 实体类名 where 实体类属性名 like  ?。

      模糊查询代码:

        // HQL模糊条件查询。查询名字中有"手"字的记录
        @Test
        public void Test5() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1、得到Query对象,并写入hql语句
                Query query = session.createQuery("from Good where gname like ?");
                // 2、填写上一步中占位符的内容
                query.setParameter(0, "%手%");
                // 3、使用Query对象的list方法得到数据集合
                List<Good> list = query.list();
                // 3、遍历集合获取数据
                for (Good good : list) {
                    System.out.println(good);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }

      模糊查询结果:

             

    3、排序查询

      排序查询hql语句:正序: form 实体类名称 order by 实体类属性名 asc

               倒序:from 实体类名称 order by 实体类属性名 desc

      (1)正序查询代码

      

    // HQL排序条件查询。gid正序查询
            @Test
            public void Test6() {
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    // 1、得到Query对象,并写入hql语句
                    Query query = session.createQuery("from Good order by gid asc");
                    // 2、使用Query对象的list方法得到数据集合
                    List<Good> list = query.list();
                    // 3、遍历集合获取数据
                    for (Good good : list) {
                        System.out.println(good);
                    }
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                } finally {
                    session.close();
                    sessionFactory.close();
                }
            }

      正序查询测试结果:

        

      (2)倒序查询代码:

      

    // HQL排序查询。gid倒序查询
        @Test
        public void Test7() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1、得到Query对象,并写入hql语句
                Query query = session.createQuery("from Good order by gid desc");
                // 2、使用Query对象的list方法得到数据集合
                List<Good> list = query.list();
                // 3、遍历集合获取数据
                for (Good good : list) {
                    System.out.println(good);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }

      倒序查询测试结果:

        

    4、分页查询

      在mysql数据库中分页使用limit实现,在Hibernate中使用Query对象的两个方法实现。

      分页查询代码:

        

    // HQL分页查询。每页3条数据查询
            @Test
            public void Test8() {
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    // 1、得到Query对象,并写入hql语句
                    Query query = session.createQuery("from Good");
                    //2、使用Query的方法实现分页
                    //2.1设置第一个要查询的位置(计算公式:(当前页数-1)*每页的记录数)
                    query.setFirstResult(0);
                    //2.2设置每页显示的最大记录数
                    query.setMaxResults(3);
                    // 2、使用Query对象的list方法得到数据集合
                    List<Good> list = query.list();
                    // 3、遍历集合获取数据
                    for (Good good : list) {
                        System.out.println(good);
                    }
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                } finally {
                    session.close();
                    sessionFactory.close();
                }
            }

       测试结果:

      

    5、投影查询

      投影查询概念:查询的不是表中的所有字段,而是一部分字段

      代码:

    // HQL投影查询。查询Good的name
        @Test
        public void Test9() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1、得到Query对象,并写入hql语句
                Query query = session.createQuery("select gname from Good");
                //2、获取结果
                List<Object> list =query.list();
            
                for (Object object : list) {
                    System.out.println(object);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }

      测试结果:

        

    6、聚集函数查询

      常用聚集函数:count  avg  max  min  sum

      以count为例进行说明

      hql语句:select count(*) from 实体类名称

        代码:

    // HQL投影查询。查询Good的name
            @Test
            public void Test10() {
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    // 1、得到Query对象,并写入hql语句
                    Query query = session.createQuery("select count(*) from Good");
                    //2、获取结果(结果为long类型)
                    Object obj = query.uniqueResult();
                    //3、转化为long(类型为long,转为int会报错)
                    Long long1 = (Long) obj;
                    int count = long1.intValue();
                    System.out.println(count);
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                } finally {
                    session.close();
                    sessionFactory.close();
                }
            }

        测试结果:

        

        

  • 相关阅读:
    生产环境常见的几种JVM异常
    JVM垃圾回收时如何确定垃圾?是否知道什么是GCRoots?
    你平时工作用过的JVM常用基本配置参数有哪些?
    java X参数
    JUC之CAS
    JUC之List集合
    JUC之lock
    JUC之volatile
    BZOJ2132: 圈地计划
    BZOJ3991: [SDOI2015]寻宝游戏
  • 原文地址:https://www.cnblogs.com/jack1995/p/6952704.html
Copyright © 2011-2022 走看看