`
jishublog
  • 浏览: 869099 次
文章分类
社区版块
存档分类
最新评论

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="selectu.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 horder 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、又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装

分享到:
评论

相关推荐

    03-HQL实用技术.pdf

    03-HQL实用技术.pdf

    HQL实用技术

    Ch05-HQL实用技术

    HQL 实用技术

    HQL 实用技术

    精通HQL.doc

    精通HQL.Hibernate技术中使用的CRUD语句,和SQL语句很相似

    使用Hibernate开发租房系统

    HibernaCte关联映射,HQL实用技术,HQL进阶,Criteria查询

    中文 深入浅出Hibernate

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出Hibernate

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化...

    java从入门到精通70个PPT

    44 HQL实用技术 45 HQL高级 46 Criteria 查询 47-49 项目实战 影院信息查询系统 50 pl/sql 51 Oracle数据库对象 52 提高数据库性能 53 hibernate总结 54 使用Spring容器管理JavaBean 55 Spring 数据访问支持 56-59 ...

    深入浅出Hibernate中文版 part2

    4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久化实现 5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R...

    深入浅出Hibernate中文版 part1

    4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久化实现 5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 第6章 Hibernate 实战——创建RedSaga论坛 6.1 目标 6.2 E-R...

    \深入浅出Hibernate

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出Hibernate2

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    《深入浅出Hibernate》1

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出Hibernate(PDF)第一部分

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出hibernate(PDF)第三部分

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出Hibernate(PDF)第二部分

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    深入浅出Hibernate.pdf

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现...

    夏昕.深入浅出Hibernate

    先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化...

Global site tag (gtag.js) - Google Analytics