分享知识-快乐自己:Hibernate各种查询操作

Posted GDBD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分享知识-快乐自己: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();
            }
        }
复制代码

测试结果:

    

以上是关于分享知识-快乐自己:Hibernate各种查询操作的主要内容,如果未能解决你的问题,请参考以下文章

分享知识-快乐自己:搭建第一个 Hibernate (Demo)

分享知识-快乐自己:Hibernate框架常用API详解

分享知识-快乐自己:初识 Hibernate 概念片

分享知识-快乐自己:论Hibernate中的缓存机制

分享知识-快乐自己:配置(各种)环境变量

分享知识-快乐自己:Hibernate对象的三种状态