zoukankan      html  css  js  c++  java
  • Hibernate之HQL查询的一些例子

      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[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

  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5246908.html
Copyright © 2011-2022 走看看