Hibernate:基于HQL实现数据查询

Posted 成那个林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }

 

以上是关于Hibernate:基于HQL实现数据查询的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate(十四):HQL查询

Hibernate(十三):HQL查询

Hibernate用到HQL查询时的错误

hibernate框架学习之数据查询(HQL)

Hibernate:HQL查询

Hibernate检索方式-HQL