• 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

  • 相关阅读:
    GIT的使用
    工具函数:cookie的添加、获取、删除
    技术分布特点:枣核型与网状结构
    js基础知识:表达式
    js基础知识:变量
    解决ie8(及其以下)不支持getElementsByClassName的问题
    毕设进度(10.29)
    毕设进度(10.28)
    毕设进度(10.27)
    毕设进度(10.26)
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5246908.html
Copyright © 2020-2023  润新知