zoukankan      html  css  js  c++  java
  • HQL实用技术

    1、hibernate查询语言

      1.1、为什么使用HQL

        1.1.1、使用hql可以避免使用jdbc查询的一些弊端

        1.1.2、不需要在编写繁复的sql语句,针对实体类及其属性进行查证

        1.1.3、查询结果是直接存放在list中的对象,不需要再次封装

        1.1.4、独立于数据库,对不同的数据库汾酒hibernate dialect属性的配置自动生成不同的sql语句执行。

      1.2、如何使用HQL

        1.2.1、得到Session  

        1.2.2、编写HQL语句

        1.2.3、创建Query对象

        1.2.4、执行查询,得到结果

    public class TestHQL{

      public static void main(String[]args){

        SessionFactory sf=null;

        Session s=null;

        try{

          sf=new Configuration().configure().buildSessionFactory();

          s=sf.openSession();

          String hql="from Street";

          Query q=session.createQuery(hql);

          List<Street>list=q.list();

          for(Street s:list){

            System.out.println("街道名称"+s.getDistrict().getName()+"区"+s.getName());

          }

        }case(HibernateException e){

          e.printStackTrace();

        }finally{

          s.close();

          sf.close();

        }

      }

    }

    2、实体查询

      2.1、where查询

        String hql="from Street as s where s.name='中关村大街' ";

        Query q=session.createQuery(hql);

        List userList=q.list();

      2.2、where子句指定限定条件

        通过与SQL 相同的比较操作符指定条件

        如:

          ==、<>、<、>、>=、<=

          between、not between

          in、not in

          is、like

        通过and、or 等逻辑连接符组合各个逻辑表达式

    3、属性查询

      3.1、查询实体对象的某个属性(数据库表中的某个字段信息)

        String hql="select u.password from User u where u.name='admin' ";

      3.2、获取实体的多个属性

        String hql="select u.id u.password from User u where u.name='admin' ";

      3.3、获取属性的类型

        String hql="select u.id u.password from User u where u.name='admin' ";

        Query q=session.createQuery(hql);

        List list=q.list();

        if(it.hasNext()){

          System.out.println("id的类型为:"+it.next().getClass());

       }

    4、参数绑定

      4.1、"?"占位符

        使用"?"占位符,可以先设定查询参数

        通过setType()方法设置指定的参数

        必须保证每个占位符都设置了参数值

        必须依照"?"所设定顺序设定

        必须从0开始,而不是使用PreparedStatement对象的从1开始

        String hql="select u.password from User u where u.name=? ";

        Query q=session.createQuery(hql);

        q.setString(0,"admin");

      4.2、命名参数

        :name即命名参数

        标识了一个名为"name"的查询参数

        根据此参数名进行参数设定

        不需要依照特定的顺序

        String hql="select u.password from User u where u.name=:name";

        Query q=createQuery(hql);

        q.setString("name","admin");

      4.3、封装参数

        动态设置查询参数

        将参数封装为一个bean

        通过Query 对象的setProperties(Object bean)实现参数的设定

        public class QueryProperties {
            private String title;                     //标题
            private Double high_price;       //价格最高值
            private Double low_price;         //价格最低值
            private String type_id;               //房屋类型编号
            private String street_id;             //街道编号
            private Integer small_floorage; //面积最小值
            private Integer big_floorage;     //面积最大值
           //省略setter 和getter 方法

      }

      

           QueryProperties qp=new QueryProperties();

            qp.setLow_price(500);   // 省略部分代码

          StringBuffer queryString = new StringBuffer();
          queryString.append("from House where ");
          queryString.append("(title like :title) ");
          queryString.append("and (street_id like :street_id) ");
          queryString.append("and (type_id like :type_id) ");
          queryString.append("and (price between :low_price and :high_price) ");
          queryString.append("and(floorage between :small_floorage and :big_floorage)

      // 省略部分代码
      Query query = session.createQuery(queryString.toString());
      query.setProperties(qp);
      List<House> list = query.list();

      for(House h:list){

        System.out.println(house.getTitle()+" "+house.getPrice()+" "+house.getFloorage()
          +" "+house.getStreet().getDistrict().getName()+" "+house.getStreet().getName());

      }
      // 省略部分代码

    5、使用聚合函数

      5.1、常用的聚合函数

        count():统计函数

          select count(hose) from Hose h where h.user_id='1010'

        max()和min():最大值和最小值

          select max(h.price),min(h.price) from Hose h

        avg()和sum():平均值和求和函数

          select avg(h.price),sum(h.floorage) from Hose h where h.user_id='1000'

        

    6、排序

      6.1、与SQL类似,HQL 通过order by 子句实现对查询结果的排序

        from House h order by h.price
      6.2、默认情况下按升序顺序排序

        from Hose h order by h.price desc
      6.3、可以指定多个排序条件

        from Hose h order by h.price,h.floorage

    7、分组

      select sum(h.floorage) from Hose h group by h.street_id having sum(h.floorage)>100

    8、分页

      8.1、Query对象提供了简便的分页方法

        8.1.1、setFirstResult(int firstResult)方法

          设置第一条记录的位置

        8.1.2、setMaxResults(int maxResults)方法

          设置最大返回的记录条数

      8.2、步骤

        8.2.1、根据结果获得总记录数

          int count=list.size();

        8.2.1、通过Query的scroll()方法获得ScrollableResults对象,从而获取总记录数

          ScrollableResults s=query.scroll();

          s.last();

          if(s.getRowNumber()>=0){

            this.totalResults=this.s.getRowNumber()+1;  

        }else{

          this.totalResults=0;

        }

        8.2.2、计算总页数

          int totalpages=(count%pageSize==0)?(count/pageSiz):(count/pageSize+1)//pageSize每页显示记录数,自定义大小

        8.2.3、实现分页

          query.setFirstResult((pageIndex-1)*pageSize);

          query.setMaxResults(pageSize);

          List result=query.list();//得到分页结果

    9、子查询

        select * from House as h1 where h1.price > ( select avg(h2.price) from House h2 where h2.street_id = '1000')

    10、Hibernate 支持两种主要的查询方式

      10.1、HQL(Hibernate Query Languge,Hibernate 查询语言)查询

        10.1.1、是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念

        10.1.2、HQL 是应用较为广泛的方式

      10.2、Criteria 查询

        10.2.1、又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装

      

  • 相关阅读:
    python
    python
    Django+Scrapy结合使用并爬取数据入库
    python--scrapy框架爬取分页数据与详情页数据
    python--简单的jQuery-Ajax使用
    python--scrapy框架配置redis数据库或者mongdb数据库
    ajax分页
    django分页
    Jquery获取输入框属性file,ajax传输后端,下载图片
    Django中web开发用md5加密图片名并存储静态文件夹
  • 原文地址:https://www.cnblogs.com/lanliying/p/3178540.html
Copyright © 2011-2022 走看看