• Hibernate:基于HQL实现数据查询


    HQL:  hibernate query language(hibernate特有的查询语言)

      hql是基于对象的查询语言,其语法与sql类似,但是他和sql的区别在于sql是面向表和字段的查询,而hql是面向对象和属性的查询。

    需求1. 查询出所有的项目

     @Test
        public void testFindAllPorject(){
            //获取hibernate session
            Session session = HibernateUtils.getSession();
            //定义hql语句
            String hql =  "select project from com.deng.hibernate.bean.Project project"; // "select * from project";
            //创建一个查询对象Query
            Query query = session.createQuery(hql);
            //调用query的相关方法来执行相关的动作
            List<Project> list = query.list();
            System.out.println(list);
            session.close();
        }

    需求2. 根据给定项目的地址模糊查询,并按照创建时间倒叙排列(hql中带参数的查询)

     @Test
        public void testFindPorjectByCondition(){
            //获取hibernate session
            Session session = HibernateUtils.getSession();
            String addr = "龙";
            //定义hql语句
            String hql =  "from com.deng.hibernate.bean.Project project " +
                   // " where project.address like ? " +   基于问号的参数
                    " where project.address like :myaddr " +//基于命名的参数,冒号是命名参数的语法开始
                    " order by project.createTime desc"; // "select * from project";
            //创建一个查询对象Query
            Query query = session.createQuery(hql);
            //设置参数,需要注意,问号参数的位置从0开始
            query.setString("myaddr","%"+addr+"%");
         //   query.setString(0,"%"+addr+"%");
            //调用query的相关方法来执行相关的动作
            List<Project> list = query.list();
            System.out.println(list);
            session.close();
        }

    需求3:查询出公司名包含【新希望】的公司下的所有的项目。

      项目和 公司的关系是多对一,在Project对象中有

      @Basic
        @ManyToOne
        @JoinColumn(name = "company_id")
        public Company getCompany() {
            return company;
        }

    此时的做法:

    @Test
        public void testFindProjectByCompanyName(){
            Session session = HibernateUtils.getSession();
            String hql = "from com.deng.hibernate.bean.Project p where " +
                    " p.company.companyName like :cname ";
            Query query = session.createQuery(hql);
            query.setString("cname","%新希望%");
            List<Project> list = query.list();
            System.out.println(list);
    
            session.close();
        }

    需求4. 查询出所有的项目,根据创建时间倒叙排列,要求是第三页的数据(每页3行)

    @Test
        public void testFindProjectByPage(){
            Session session = HibernateUtils.getSession();
            String hql = "from com.deng.hibernate.bean.Project p order by p.createTime desc";
            Query query = session.createQuery(hql);
            //设置结果集的起始索引,也就是从多少行开始取
            query.setFirstResult(6);
            //设置最多获取多少条数据
            query.setMaxResults(3);
            List<Project> list = query.list();
            System.out.println(list);
    
            session.close();
        }

    需求5. 获取总共有多少个项目

    @Test
        public void testCountProject(){
            Session session = HibernateUtils.getSession();
            String hql = "select count(1) from com.deng.hibernate.bean.Project p ";
            Query query = session.createQuery(hql);
            //uniqueResult 返回唯一的结果
            Long count = (Long)query.uniqueResult();
            System.out.println("----------->"+count);
            session.close();
        }

     需求6. 统计每个项目的可租面积和产权面积的综合

     //查询出所有资源的可租面积总和,产权面积总和
        @Test
        public void testSumResource(){
            Session session = HibernateUtils.getSession();
    
            String hql = "select res.project, sum(res.measureArea) as allArea,sum(res.canLeaseArea) as can from Resource res " +
                    " group by res.project";
            Query query = session.createQuery(hql);
            //有多行数据时
            List<Object[]> list = query.list();
            //只有一行数据
    //        Object[] obj = (Object[])query.uniqueResult();
    //        System.out.println(obj[0]);
    //        System.out.println(obj[1]);
    
            session.close();
        }
  • 相关阅读:
    学习Java的知识体系路线(详细完整版,附图加目录)
    数组的定义和使用,理解多维数组和Array类
    Java运算符使用总结(重点:自增自减、位运算和逻辑运算)
    Java常用修饰符总结
    实例/静态变量、局部变量和常量的定义及其作用域
    Nothing is impossible
    科班学习java遇到瓶颈,每天云里雾里怎么办?
    人生路漫漫,相见不如不见
    基于视频的车辆识别
    编译原理课后习题答案令A,B和C是任意正规式,证明以下关系成立(A|B)*=(A*B*)*=(A*|B*)*
  • 原文地址:https://www.cnblogs.com/dengcl/p/7609858.html
Copyright © 2020-2023  润新知