hql实用技术

来源:互联网 发布:如何在mac上卸载软件 编辑:程序博客网 时间:2024/05/13 12:19

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()+"\t\t"+house.getPrice()+"\t\t"+house.getFloorage()
      +"\t\t"+house.getStreet().getDistrict().getName()+"\t\t"+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、又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装