zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己:Hibernate各种查询操作

    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();
                }
            }
    复制代码

    测试结果:

        

  • 相关阅读:
    Java 学习笔记之 线程interrupted方法
    Java 学习笔记之 线程interrupt方法
    定义函数
    调用函数
    pass语句
    循环
    条件语句
    别样赋值
    import语句
    字典方法
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9860173.html
Copyright © 2011-2022 走看看