hibernate学习---单表查询

咱们都知道SQL是很是强大的,为何这么说呢?相信学过数据库原理的同窗们都深有体会,SQL语句变化多端,好绝不夸张的说能够实现任意符合咱们须要的数据库操做,既然前面讲到Hibernate很是强大,因此Hibernate也是可以实现SQL的一切数据库操做。sql

 

在SQL中,单表查询是最经常使用的语句,同理Hibernate最经常使用到的也是查询语句,因此今天就来说讲Hibernate的单表查询:数据库

  

今天要将的内容分如下几点:缓存

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

Hibernate不只为咱们提供了它自己的查询语句HQL,同时也还提供了SQL和criteria标准查询,接下来咱们都会来一一实验。服务器

废话很少说,直接上代码:session

查询全部:

  SQL:app

 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):spa

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

 

查询结果排序:

SQL:.net

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

 

HQL:hibernate

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的基本单表查询学的差很少了(我这里只列举了咱们常用到的一些操做)。

相关文章
相关标签/搜索