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

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

作者:何征天

课程视频地址: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());

       }

    }










【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值