Hibernate之HQL查询的一些例子

小编 2026-07-13 阅读:462 评论:0
  Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query...

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

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

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


 

Hibernate之HQL查询的一些例子            Hibernate之HQL查询的一些例子

 


需求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[0]+"---"+o[1]);        }

需求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

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表