zoukankan      html  css  js  c++  java
  • hibernate学习---单表查询

    我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以Hibernate也是能够实现SQL的一切数据库操作。

    在SQL中,单表查询是最常用的语句,同理Hibernate最常用到的也是查询语句,所以今天就来讲讲Hibernate的单表查询:

      

    今天要将的内容分以下几点:

    • 查询所有
    • 查询结果排序
    • 为查询参数动态赋值
    • 分页查询
    • 模糊查询
    • 唯一性查询
    • 聚合函数查询
    • 投影查询
    • 分组查询
    • 单表查询的迭代
    • 命名查询

    Hibernate不仅为我们提供了它本身的查询语句HQL,同时也还提供了SQL和criteria标准查询,接下来我们都会来一一实验。

    废话不多说,直接上代码:

    查询所有:

      SQL:

     String sql = "select * from t_student";
            List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();
            for(Student student:list) {
                System.out.println(student);
            }
            //sql语句和我们原生的sql语句一样,查询后的
            //createSQLQuery(sql)这个返回的是一个sql语句,通过查询获得的是一个结果集(Set),然后Hibernate通过addEntity进行封装,返回一个list集合,里面装着封装好的Student对象。

    HQL:

     String hql = "from Student";//这里放的是Student类,因为HQL查询时面向对象的。
            List <Student>list = session.createQuery(hql).list();//正因为查询是面向对象的,所以不需要封装。
            for(Student student:list) {
                System.out.println(student);
            }

    QBC(Query By Criteria):

     List <Student>list = session.createCriteria(Student.class).list();
            for(Student student:list) {
                System.out.println(student);
            }
            //它也是面向对象查询,只需要将Student Class对象最为参数就行,连语句都不需要0.0

    查询结果排序:

    SQL:

    String sql = "select * from t_student order by t_age desc";
    //降序,升序为asc
            List<Student> list =session.createSQLQuery(sql).addEntity(Student.class).list();

    HQL:

    String hql = "from Student order by age desc";
            List <Student>list = session.createQuery(hql).list();

    QBC:

    List <Student>list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list();
    
    //session.createCriteria(Student.class).addOrder(Order.asc("age")).list();
    
    //QBC的特殊查询,每个查询都会对应方法

    为查询参数动态赋值:

      接下来我们只验证HQL语句,因为SQL语句和我们学过的都一样,之前只是演示了它在Hibernate中的用法。

      在JDBC中我们可以使用预处理语句来提高效率,并且可以用来防止SQL注入攻击,Hibernate同样可以完成类似的操作:

    //方法一:
    String hql = "from Student where age>?";
            List <Student>list = session.createQuery(hql).setInteger(0, 25).list();
            //setInteger(0, 25)位置从0开始,JDBC是从1开始
    //方法二:
    String hql = "from Student where age>:age";//以冒号开头起别名
    List <Student>list = session.createQuery(hql).setInteger("age", 25).list();
    //方法三:
    String hql = "from Student where age>?";
            List <Student>list = session.createQuery(hql).setParameter(0, 25).list();
            //这里设置参数要注意数据类型,如果类中字段定义的是Double类型,那么setParameter(0, 25)参数25应该为写为25.0

    分页查询:

    在SQL中分页查询时非常重要的了,在Hibernate中也同样是。 
    在传统的SQL语句中分页查询的语句为:

    select*from table limit startIndex,pageSize;

    HIbernate里面的分页不是通过语句来实现的,而是通过方法对session操作来实现的:

          int page = 2;//前台需要分页的时候一般会向后台提交页数
            int pageSize = 3;//由前台传回需要每页几条数据
            int firstResult = (page-1)*pageSize;//结果集是从零开始
    
            List <Student>list = session.createQuery(hql).setFirstResult(firstResult).setMaxResults(pageSize).list();
        //这样就完成了我们的分页

    模糊查询:

    同样Hibernate也提供了模糊查询:

    //方法一:
    String hql = "from Student where name like '%张%'";
            List <Student>list = session.createQuery(hql).list();
    //方法二:
    String hql = "from Student where name like ?";
            List <Student>list = session.createQuery(hql).setString(0, "%张%").list();
    //方法三:
    String hql = "from Student where name like:name";
            List <Student>list = session.createQuery(hql).setString("name", "%张%").list();

    唯一性查询:

    String hql = "from Student where id=:id";
            Student student = (Student)session.createQuery(hql)
                                        .setInteger("id", 1)
                                        .uniqueResult();
                                        //之前我们得到的都是list集合,通过.uniqueResult();可以得到单个结果集,也就是封装好的单个对象。

    聚合函数查询:

    String hql = "select count(*) from Student ";
            Long count = (Long)session.createQuery(hql)
                                              .uniqueResult();
    //聚合函数count查询出来的数是long数据类型,也是uniqueResult

    投影查询:

    投影查询也就是查询部分字段。如:id,name,age,score 
    我们只需要查询name,age,就叫做投影查询。

    String hql = "select new Student(name,age) from Student ";
            List<Student> list = session.createQuery(hql)
                                                 .list();
    //因为hql语句是面向对象的查询,所以投影查询需要new一个含有所投影字段的对象(同时要在实体类中添加对应是构造函数)

    分组查询:

    String hql = "select age from Student group by age having count(age)>4 ";
            List<Integer> list = session.createQuery(hql)
                                             .list();
    //对于查询单个的字段,因为有数据类型与它对应,所以不需要新建对象,可以直接查询。 HQL分组查询和SQl查询方法基本一致 

    Query接口的iterator

    iterator(迭代器)首先会从session缓存中查询我们需要的内容,如果没有我们需要的内容,然后去数据库用sql语句查询。 

    多次查询相同的内容我们可以用到Hibernate的缓存特性(session),可以加快查询的效率。 

    传统的我们用HQL查询的时候,每次都需要去数据库中查询,这样如果查询同样的内容就会造成数据库服务器负载过重(例如新闻主页,就会多次查询相同内容),当第一次查询过后session没有clear或者close之前我们已经查询过的内容都会在session中缓存,所以当第二次查询的时候我们就可以使用迭代器了。 

    我们知道从session中读取数据远远比从数据库中读取数据要快。

    但是,迭代器对于没有查询过的内容(也就是session缓存中没有要查询的数据的时候),效率会特别低,所以我们建议对于同样查询,第一次使用list查询,第二次及以后使用iterator迭代。

    命名查询:

    我们也可以将经常用到的查询语句在我们Hibernate主配置文件中配置好。

    <!--注意,query标签是<hibernate-mapping>的子标签-->
    <query name="queryById">from Student where id=:id</query>
    //使用getNamedQuery方法来获得配置文件中的查询语句。
        Student student = (Student)session.getNamedQuery("queryById").setInteger("id", 1).uniqueResult();

    到这里我们就将Hibernate的基本单表查询学的差不多了(我这里只列举了我们经常使用到的一些操作)。

    版权声明:本文为博主原创文章,如需转载请表明出处。 https://blog.csdn.net/qq_39266910/article/details/78587154

  • 相关阅读:
    通信架构
    通信架构
    17.2?Replication Implementation 复制实施:
    17.2?Replication Implementation 复制实施:
    17.1.1.8?Setting Up Replication with Existing Data设置复制使用存在的数据
    17.1.1.8?Setting Up Replication with Existing Data设置复制使用存在的数据
    17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制对于新的Master和Slaves:
    Hi3531用SPI FLASH启动 使用Nand做文件系统 分类: HI3531 2013-08-28 10:26 884人阅读 评论(0) 收藏
    Hi3531支持2GByte内存 分类: HI3531 2013-08-28 10:25 738人阅读 评论(0) 收藏
    Hi3531添加16GByte(128Gbit) NAND Flash支持 分类: HI3531 2013-08-28 10:23 861人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/chengshun/p/9771640.html
Copyright © 2011-2022 走看看