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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM