【极客营】Hibernate查询之HQL查询-技术分析之HQL的查询演示

本文详细介绍了Hibernate中的HQL查询,包括基本查询格式、使用别名、排序、分页、条件查询、投影查询、聚合函数应用以及多表查询。通过实例代码展示了HQL在各种场景下的使用方法,帮助读者掌握HQL操作数据库的技巧。

作者:何征天

课程视频地址:https://ke.qq.com/course/273907

1.1.  准备工作:

1.把今天的课前资料\sql\db.sql导入数据库hibernate_day04

2.新建web项目hibernate5_day04

3.拷贝第三天hibernate项目的jar包及配置文件

 4.修改hibernate.cfg.xml中配置的数据库信息

<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day04</property>

4.在com.igeek.demo1下新建TestHQL类,代码如下:

packagecom.igeek.demo1;

 

import java.util.Arrays;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

 

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

 

importcom.igeek.util.HibernateUtils;

 

publicclass TestHQL {

   

    private Session session;

    private Transaction tr;

   

    @Before

    publicvoid init(){

       session = HibernateUtils.getCurrentSession();

       tr = session.beginTransaction();

    }

 

    @After

    publicvoid destroy(){

       tr.commit();

    }

}

1.2.  HQL基本的查询格式
     * 支持方法链的编程,即直接调用list()方法
     * 简单的代码如下
     * session.createQuery("fromCustomer").list();

//查询所有客户信息 ,使用list方法

    @Test

    publicvoid run1(){

       //1.通过session的createQuery方法执行hql语句

       //Customer指的是java类,hibernate通过javabean来操作数据库

        Query query = session.createQuery("from Customer");

       print(query);

    }

   

    privatevoid print(Query query) {

       //2.调用list方法获取集合值,使用泛型接收

        List<Customer> data = query.list();

        //3.遍历

        for (Customer customer : data) {

            System.out.println(customer.getCust_name()+"-->"+customer.getCust_level());

       }

    }

1.3.  使用别名的方式

      * 可以使用别名的方式
       * session.createQuery("fromCustomer c").list();
       * session.createQuery("selectc from Customer c").list();

//使用别名

    @Test

    publicvoid run2(){

//     Query query = session.createQuery("from Customer c");

       Query query = session.createQuery("select c from Customer c");

       print(query);

    }

1.4  排序查询

 * 排序查询和SQL语句中的排序的语法是一样的
      * 升序
                   * session.createQuery("from Customer order bycust_id").list();
            
       * 降序
                * session.createQuery("fromCustomer order by cust_id desc").list();

//排序

    @Test

    publicvoid run3(){

       //升序

//     Query query = session.createQuery("from Customer order by cust_id");

       //降序

       Query query = session.createQuery("from Customer order by cust_id desc");

       print(query);

    }

1.5.  分页查询

       * Hibernate框架提供了分页的方法,咱们可以调用方法来完成分页
       * 两个方法如下
       * setFirstResult(a) --从哪条记录开始,如果查询是从第一条开启,值是0

       * setMaxResults(b) -- 每页查询的记录条数      
       * 演示代码如下

//分页

  @Test

    publicvoid run4(){

       Query query = session.createQuery("from Customer");

       //设置记录开始索引,从0开始

       query.setFirstResult(0);

       //设置每页查询的记录条数

       query.setMaxResults(3);

       print(query);

    }

1.6.  带条件的查询

      * setParameter("?号的位置,默认从0开始","参数的值"); 不用考虑参数的具体类型
      * 按位置绑定参数的条件查询(指定下标值,默认从0开始)
      * 按名称绑定参数的条件查询(HQL语句中的 ? 号换成 :名称 的方式)
      * 例如代码如下

//条件查询

    @Test

    publicvoid run5(){

       //找出所有姓林的明星

       Query query = session.createQuery("from Customer where cust_name like ?");

       //设置占位符参数

       //第一个参数是?的索引,从0开始

       //第二个参数是占位符的值

       query.setParameter(0, "%林%");

       print(query);

    }

//条件查询

    @Test

    publicvoid run51(){

       //找出所有姓林的明星

       Query query = session.createQuery("from Customer where cust_name like :name");

       query.setParameter("name", "%林%");

        print(query);

    }

1.7.   HQL的投影查询

    1.投影查询就是想查询某一字段的值或者某几个字段的值
    2. 投影查询的案例
      * 如果查询多个字段,例如下面这种方式

//投影查询就是想查询某一字段的值或者某几个字段的值

    @Test

    publicvoid run6(){

       //查找所有明星的姓名和级别

       Query query = session.createQuery("select c.cust_name,c.cust_level from Customer c");

       //这里不能用  print(query)方法来打印,因为返回的是Object数组,需要使用Object数组来接收

       List<Object[]> data = query.list();

       for (Object[] o : data) {

           System.out.println(o[0]+"-->"+o[1]);

       }

    }

  
      * 如果查询两个字段,也可以把这两个字段封装到对象中
        * 先在持久化类中提供对应字段的构造方法
        * 使用下面这种HQL语句的方式

/**

     * 需要提供一个空的构造方法,hibernate默认使用空的构造方法来创建对象

     */

    public Customer() {

    }

 

    public Customer(String cust_name, String cust_level) {

           this.cust_name = cust_name;

           this.cust_level = cust_level;

    }

//投影查询:如果查询两个字段,也可以把这两个字段封装到对象中

    //先在持久化类中提供对应字段的构造方法

    @Test

    publicvoid run7(){

       //把姓名和级别传入构造方法

       Query query = session.createQuery("select new Customer(c.cust_name,c.cust_level) from Customer c");

       print(query);

    }

1.8.   技术分析之聚合函数查询

    1.uniqueResult() 唯一的结果。如果查询的结果只包含一个对象,使用uniqueResult(),如果查询结果包含多个对象,使用uniqueResult抛出异常
    
    2. 获取总的记录数

//获取总记录数

    @Test

    publicvoid run8(){

       Query query = session.createQuery("select count(c) from Customer c");

       Long count = (Long) query.list().get(0);

       System.out.println(count);

    }

3. 获取某一列数据的和

//获取某一列数据的和

    @Test

    publicvoid run9(){

       Query query = session.createQuery("select sum(c.cust_id) from Customer c");

       Long sum = (Long) query.uniqueResult();

       System.out.println(sum);

    }

4. 分组的查询
       * 使用group by 属性 进行分组

//对客户等级分组

    @Test

    publicvoid run10(){

       Query query = session.createQuery("select c.cust_level from Customer c group by c.cust_level");

       List<Object> data = query.list();

       for (Object object : data) {

           System.out.println(object);

       }

    }

1.9.   技术分析之HQL多表查询

1. 多表的查询进来使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似。
        * 内连接查询
            * 显示内连接
                * select* from customers c inner join orders o on c.cid = o.cno;
            * 隐式内连接
                * select* from customers c,orders o where c.cid = o.cno;
        
        * 外连接查询
            * 左外连接
                * select* from customers c left join orders o on c.cid = o.cno;
            * 右外连接
                * select* from customers c right join orders o on c.cid = o.cno;
    
    2. 内连接查询
        * 内连接使用 inner join ,默认返回的是Object数组

添加Customer类的构造方法

public Customer() {

       // TODO Auto-generated constructor stub

    }

//内连接

    //查询所有客户及对应的联系人

    @Test

    publicvoid run11(){

       //显示内连接

       Query query = session.createQuery("from Customer c inner join c.linkmans");

       List<Object[]> data = query.list();

       for (Object[] object : data) {

           System.out.println(Arrays.toString(object));

           Customer c = (Customer) object[0];

           Linkman m = (Linkman) object[1];

           System.out.println(c.getCust_name()+"-->"+m.getLkm_name());

       }

    }

迫切内连接:innerjoin fetch ,返回的是实体对象

//迫切内连接

    //查询所有客户及对应的联系人

    @Test

    publicvoid run12(){

       //显示内连接

       Query query = session.createQuery("from Customer c inner join fetch c.linkmans");

       List<Customer> data = query.list();

       for (Customer customer : data) {

        System.out.println(customer.getCust_name()+"-->"+customer.getLinkmans().size());

       }

    }

3. 左外连接查询
        * 左外连接:    封装成List<Object[]>
        * 迫切左外连接

//迫切左外连接

    @Test

    publicvoid run13(){

       //显示客户表所有数据及联系人表中与客户关联的数据

       Query query = session.createQuery("from Customer c left join fetch c.linkmans");

       List<Customer> data = query.list();

       for (Customer customer : data) {

    System.out.println(customer.getCust_name()+"-->"+customer.getLinkmans().size());

       }

    }










(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值