Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承,多态之类的概念.

  HQL区分大小写,sql语句关键字(如select ,from,where等)是不区分大小写的.

  假设我们现在有两张表,分别是Book,和Category:


            


需求1:查询Book表中所有的书名:

Session session=HibernateUtil.getSession();
//list()方法返回查询结果
//返回结果的类型是根据查询的列决定的,这里查询了name属性,因为name属性时String类型的,所有得到的是一个String类型的集合
List<String> list=session.createQuery("select name from Book").list();
for(String s:list){
System.out.println(s);
}

需求2:查询book表中所有的书名以及作者(查询多个列):

  方法1:

Session session=HibernateUtil.getSession();
//list()方法返回查询结果
//查询多个属性时返回的是数组集合,这里name,和author都是String类型,所以得到的是
List<Object[]> list = session.createQuery("select name,author from Book").list();
for(Object[] o:list){
System.out.println(o[0]+"----"+o[1]);
}

  方法2:

    1.在Book实体类中,新建一个构造函数,参数为name和author,(注意别忘了无参构造函数);

    2:

Session session=HibernateUtil.getSession();
//list()方法返回查询结果,返回的是Book类型的集合,
  //如果希望查询book所有列,hql语句直接写成 " from Book"就可以了.不能写成"select * from Book".
  //Hql语句中也可以使用别名,如果使用别名还可以写成,"select b from Book b";
  //下面语句 也可以写成这样:select new Book(b.name,b.author) from Book b;
   List<Book> list = session.createQuery("select new Book(name,author) from Book").list(); 

  for(Book book:list){ System.out.println(book); }

打印结果为:

Book [id=0, name=鹿鼎记, price=0.0, author=金庸, pubDate=null, category=null]
Book [id=0, name=斗破苍穹, price=0.0, author=土豆, pubDate=null, category=null]
Book [id=0, name=吞噬星空, price=0.0, author=番茄, pubDate=null, category=null]
Book [id=0, name=亮剑, price=0.0, author=都梁, pubDate=null, category=null]
Book [id=0, name=邪气凛然, price=0.0, author=耳根, pubDate=null, category=null]

需求3:条件查询,查询2<ID<5的所有Book:

 Session session=HibernateUtil.getSession();
//list()方法返回查询结果,这里返回的是Book类型的集合
//因为这里的id是int类型的,所以也可以将setParameter方法写成setInteger,第一个参数:0代表第一个问号
List<Book> list = session.createQuery("from Book where id < ? and id >?").setParameter(0, 5).setParameter(1, 2).list();
for(Book book:list){
System.out.println(book);
}

打印结果为:

Book [id=3, name=吞噬星空, price=27.35, author=番茄, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@67977199]
Book [id=4, name=亮剑, price=42.35, author=都梁, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@62d075cc]

需求4:查询Category为"玄幻类"的所有Book:

List<Category> list = session.createQuery("from Category where name = :name").setParameter("name", "玄幻类").list();
Set<Book> books = list.get(0).getBooks();
Iterator<Book> it = books.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

  打印结果为:

Book [id=2, name=斗破苍穹, price=22.35, author=土豆, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@56446e79]
Book [id=3, name=吞噬星空, price=27.35, author=番茄, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@56446e79]

需求5:分页查询:

List<Book> list = session.createQuery("from Book")
.setFirstResult(0)//开始显示的记录下表((currentPage-1)*pageSize)
.setMaxResults(3)//设置每页记录数pageSize
.list();
for(Book book:list){
System.out.println(book);
}

打印结果为:

Book [id=1, name=鹿鼎记, price=12.35, author=金庸, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@1242f625]
Book [id=2, name=斗破苍穹, price=22.35, author=土豆, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@7f1654f]
Book [id=3, name=吞噬星空, price=27.35, author=番茄, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@7f1654f]

如果将setFilrstResult(),的参数改为3:则会显示:

Book [id=4, name=亮剑, price=42.35, author=都梁, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@1cb6a410]
Book [id=5, name=邪气凛然, price=12.35, author=耳根, pubDate=2016-03-06 09:25:41.0, category=com.wang.pojo.Category@1d0b2840]

需求6:查询图书总数(统计查询):

    //查询图书总数
//结果唯一
//返回一个数据,可能是int,long,double都有可能
    //如果是查询价格最高的图书 hql语句为:"select max(b.price) from Book b";
Number i= (Number)session.createQuery("select count(b.name) from Book b").uniqueResult();
System.out.println("共有图书"+i.intValue()+"本");

需求7:查询每种分类下的图书总数(Group by的使用):

    //查询每种分类下的图书
List<Object[]> list= (List)session.createQuery("select b.category.name,count(b.id) from Book b group by b.category.name").list();
for(Object[] o:list){
System.out.println(o[]+"---"+o[]);
}

需求8:查询"玄幻类"的所有图书信息:

    //查询玄幻类下的图书信息
List<Book> list= (List)session.createQuery("from Book b where b.category.name=:name")
.setParameter("name", "玄幻类")
.list();
for(Book b:list){
System.out.println(b);
}

需求9:查询每个每本图书对应的分类(使用左外连接,为了是结果更有代表性,在category表中添加一条数据"5,情感类"):

        List<Object[]> list= (List)session.createQuery("select c.name,b.name from Category c left outer join c.books b")
.list();
for(Object[] o:list){
System.out.println(o[0]+"----"+o[1]);
}

打印结果为:

武侠类----鹿鼎记
玄幻类----斗破苍穹
玄幻类----吞噬星空
历史类----亮剑
都市类----邪气凛然
情感类----null

Hibernate之HQL查询的一些例子的更多相关文章

  1. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  2. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  3. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  4. Hibernate 的hql查询简介【申明:来源于网络】

    Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...

  5. hibernate的hql查询语句总结

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  6. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  7. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  8. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  9. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

随机推荐

  1. Android中数据存储(一)

    国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...

  2. 转:CentOS, 找不到dump命令:command not found

    dump 功能说明:备份文件系统.语 法:dump [-cnu][-0123456789][-b <区块大小>][-B <区块数目>][-d <密度>][-f &l ...

  3. Des与3Des加密解密

    /// <summary> /// Des和3Des算法 /// </summary> public class Des { /// <summary> /// D ...

  4. Web系统的常用测试方法

    在51上看到一篇不错的文章,拿过来分享一下,学习学习! Web系统的常用测试方法如下: 1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确. 2. 相关性检查:删除/增加一项会不会 ...

  5. MapleSim助力长臂挖掘机建模问题解决

    1.问题描述 一家机械零部件设计公司需要一个挖掘机模型,验证他们的零部件是否匹配完整的挖掘机系统.由于他们是一个零部件供应商,公司没有足够的资源和研发人员使用传统的工具创建一个完整系统的详细模型.然而 ...

  6. linux 实践2.2 编译模块

    1.  理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维 ...

  7. [译]MVC网站教程(三):动态布局和站点管理

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.   自定义操作结果和控制器扩展 1)   OpenFileResult 2)   ImageR ...

  8. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

    本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...

  9. Go项目结构和模块导入

    Go项目结构和模块导入 golang项目结构与其他语言类似,但是仍然有一些需要注意的地方. 项目结构 环境配置 go 命令依赖一个重要的环境变量:$GOPATH,它表示GO项目的路径,如下设置 exp ...

  10. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...