JavaEE之Hibernate(hql查询语句)

HQL单表查询 ---- Hibernate之查询语句


HQL查询数据

本章节主要学习的是HQL查询方式的单表查询,多表查询在下一章节学习记录;

HQL介绍

HQL(Hibernate Query Language):是hibernate的数据查询方式,HQL是针对持久化对象的,它用来取得对象而不进行update、delete和insert等更新操作,是一种完全面向对象的查询方式,并且具备继承、多态和关联等特性,因此在里面的查询语句都是针对实体对象以及实体对象中的属性的,不要搞混了;

几种查询方式

1. 简单查询 
此查询是hql的基本查询方式,没有任何修饰,查询所有一张表的所有数据 
代码如下:

@Test
    /*
     * HQL的基本查询
     */
    public void demo1() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        // String sql1 = "from com.java.domain.Customer";//全类名书写
        String sql = "from Customer";// 简单书写
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

HQL数据查询是一面向对象的形式,因此,sql=”from Customer”;这句中的Customer是实体对象的名称,而非数据库表的名表名,关于实体类名有两种书写方式,一种是全类名,即:从src到类名,这种写法是为了防止碰到相同类名的文件(一般情况下没必要这么写);第二种是直接写类名的简单书写,这种是最常用的;


2. 排序查询 
排序查询和基本查询差别不大,主要是在查询的类名后边添加order by+排序依据的列名+排序方式,与sql语句的类似(asc是升序方式,desc是降序方式);

@Test
    /*
     *  排序查询
     */
    public void demo2() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer order by cust_id desc";// asc:升序    desc:降序
        Query cust = session.createQuery(sql);
        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

3. 条件查询 
与sql语句类似,where后边加上根据哪个列进行条件查询,并通过占位符来进行查询; 
占位符存在两种,一种是直接用问号,第二种是起代号,注意,起代号的方式需要在代号前加冒号;两种操作如下所示:

 

@Test
    /*
     * 条件查询
     */
    public void demo3() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        //String sql = "from Customer where cust_id=?";//通过问占位
        String sql1 = "from Customer where cust_id=:id ";//通过“代号”占位
        Query cust = session.createQuery(sql1);
        //cust.setParameter(0, 2l);//通过问号占位的从0开始排序
        cust.setParameter("id", 2l);
        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

 

问号占位符需要在setparameter中从0开始排序, 
代号占位符需要在setparameter中先写代号,再写条件查询的条件值;


4. 分页查询 
分页查询只需要两个关键字,setFirstResults()和setMaxresults(),第一个是起始索引值,第二个每页最大显示数据条数; (起始索引值 = (当前页数-1)* 每页显示条数)

 

@Test
    /*
     * 分页查询
     */
    public void demo4() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql = "from Customer";
        Query cust = session.createQuery(sql);
        //limit ?,?    索引起始 = (当前页数-1)* 每页要显示的数据条数
        cust.setFirstResult(2);//起始索引
        cust.setMaxResults(2);//每页显示条数

        List<Customer> list = cust.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        bt.commit();
        session.close();
    }

 

5. 统计查询 
统计查询重点在于关键字,这个关键字和排序查询一样,都在查询语句中,和分页查询的关键字不一样,分页查询的关键字是在代码中,不是在查询语句中; 
主要的几个关键字:

  • count 统计
  • sum 求和
  • avg 平均数
  • max(min)最大值(最小值)

代码:

 

@Test
    /* 
     *统计查询
     */
    public void demo5() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql_count = "select count(*) from Customer";
        String sql_sum = "select sum(cust_id) from Customer";
        String sql_avg = "select avg(cust_id) from Customer";//获得的是double类型的返回值
        String sql_max = "select max(cust_id) from Customer";
        String sql_min = "select min(cust_id) from Customer";

        Query cust = session.createQuery(sql_avg);
        Number uniqueResult = (Number) cust.uniqueResult();
        System.out.println(uniqueResult);

        bt.commit();
        session.close();
    }

在关键字后的括号内填入根据实体对象的那个属性进行统计查询,不是根据数据库表的列名 
接收转化的关键字需要注意,使用uniqueresult方法进行接收,Number类进行存放,Number类型的是封装的接收类,里面封装了各种数据类型的接收方法,直接使用就OK了。


6. 投影查询 
投影查询就是查询一个表中某几个自己需要的字段数据,这个查询的好处就是能够简明快速的查询到自己想要的数据,不会浪费内存等资源; 
在返回值方面需要注意,返回值是一个list类型的;

@Test
    /*
     * 投影查询
     * 
     */
    public void demo6() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String sql1 = "select cust_name from Customer";
        String sql2 = "select cust_id,cust_name from Customer";//这种显示效果不佳,一般不使用
        String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在对应的Customer实体类中构造方法,创建无参构造
        Query cust = session.createQuery(sql3);

        List list = cust.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

查询单个字段属性时,直接将表中字段名对应的实体类的属性名写上即可,如果是查询多个而非表中所有时,直接以: 
Select new 对象名(属性名1,属性名2,…) from 类名; 
注意:此中的对象名的对象是需要在实体类名的类中进行构造的,并且要类中有对应的无参构造,以上面的sql3的查询语句为例,其在Customer类中的对象的构造以及无参构造如下所示: 
无参构造截图这个例子中主查询类是Customer,所以其返回值的范型是Customer,运行的结果如下图所示: 
运行的结果截图

从中可以看出,数据变成了一条一条的被放在以一个数据集合中;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值