Hibernate ORM框架——Hibernate分頁查詢and多表查詢


今日學習主要知識點(所借用案例都是雙向多對一,一對多):

1.分頁

2.多表查詢

3.所需數據庫代碼

insert into CLASSINFO values('c111','banji1');
insert into CLASSINFO values('c222','banji2');


insert into persons values('p1','p111','c111')
insert into persons values('p2','p222','c111')
insert into persons values('p3','p333','c222')
insert into persons values('p4','p444','c222')
insert into persons values('p5','p555',null)

select * from CLASSINFO

select * from persons 
inner join CLASSINFO
on persons.rci = CLASSINFO.cid

select * from persons
left outer join CLASSINFO
on persons.rci = CLASSINFO.cid

select * from CLASSINFO
left outer join persons
on CLASSINFO.cid = persons.rci

 

一、分頁查詢

(1)圖解

 

 

 (2)分頁Main測試

public static void main(String[] args) {
        
        //老師,分頁1,當前頁下標從0開始
        //pageQuery1(3,1);//第二頁:序號為4,即從序號4開始,把第二頁的所有數據顯示出來
        
        //my分頁2,改進,當前頁下標從1開始(正常的日常分頁)
        //pageQuery2(3,2);//第一頁:(3,1)每頁顯示3條記錄,當前頁為1
        
    }

    /*
     * pageSize:表示每頁顯示的記錄數量
     * pageno:表示顯示的是第幾頁(數字是從1開始)
     * 
     * pageIndex:表示顯示的是第幾頁(數字是從0開始)        選擇
     * 當pageIndex=2時,意味着當前顯示的是第3頁
     * 所以(3,2)表示的是每條記錄顯示3條,第三頁的第一個序號為7
     * 即:從序號為7開始,把第三頁的所有數據輸出
     * (3,2)=6--> 7
     * 
     * 0,1,2,3,4,5,6
     */

    private static void pageQuery1(int pageSize,int pageIndex) {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        String hql = "select p from Person p ";
        Query q = s.createQuery(hql);
        q.setMaxResults(pageSize);//這個參數設定的其實是每頁記錄總數
        q.setFirstResult(pageSize*pageIndex);//每頁的第一條記錄所在序號公式

        List<Person> list = q.list();
        for(Person p: list){
            System.out.println(p);        
        }
        
        tx.commit();
        s.close();
        sf.close();
    }
    
    /*
     * 如果選用
     * pageno:表示顯示的是第幾頁(數字是從1開始)
     * (3,1)每頁顯示3條記錄,當前頁為1
     * pagesize(pageno-1)+1-->當前序號,需-1
     * 
     * */
    private static void pageQuery2(int pageSize,int pageno) {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        String hql = "select p from Person p ";
        Query q = s.createQuery(hql);
        
        q.setMaxResults(pageSize);//這個參數設定的其實是每頁記錄總數
        q.setFirstResult(pageSize*(pageno-1));//每頁的第一條記錄所在序號公式
        
        List<Person> list = q.list();
        for(Person p: list){
            System.out.println(p);        
        }
        
        tx.commit();
        s.close();
        sf.close();
    }
}

 

二、多表連接查詢

(1)圖解

 

 (2)多表連接查詢Main測試

package com.nf;



import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;

import shuang.m2oo2m.Person;
import util.HibernateUtil;

public class Main {

    public static void main(String[] args) {
//多表連接
        //內連接
        //innerQuery();
        
        //左外連接1:以Person為主表
        //leftOuterJoin();
        
        //左外連接2:以ClassInfo為主表
        //leftOuterJoin2();
        fetchJoin() ;
    }
private static void innerQuery() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        /*inner join p.ci中的p.ci是通過實體對象Person中的屬性ci映射找到對應的班級信息而來*/
        String hql = "select p from Person p inner join p.ci c ";
        Query q = s.createQuery(hql);

        List<Person> list = q.list();
        for(Person p: list){
            System.out.println(p);        
        }
        tx.commit();
        s.close();
        sf.close();
        
        /*結果
        Person [pid=p1, name=p111]
        Person [pid=p2, name=p222]
        Person [pid=p3, name=p333]
        Person [pid=p4, name=p444]
         * */
    }
    
    
    private static void leftOuterJoin() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        String hql = "select p from Person p left join p.ci c ";
        Query q = s.createQuery(hql);

        List<Person> list = q.list();
        for(Person p: list){
            System.out.println(p);        
        }
        
        /*結果
        Person [pid=p1, name=p111]
        Person [pid=p2, name=p222]
        Person [pid=p3, name=p333]
        Person [pid=p4, name=p444]
        Person [pid=p5, name=p555]
         * */
        
        tx.commit();
        s.close();
        sf.close();
    }
    /*
     * 此方法演示的是,鏈接的時候,如果select多個實體
     * 返回的是對象數組,而不是Person 的list集合
     * 這樣導致取數據的時候麻煩
     */
    private static void leftOuterJoin2() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        String hql = "select p,c from Person p left  join p.ci c ";
        Query q = s.createQuery(hql);

        List<Object[]> list = q.list();
        for(Object[] data: list){
            System.out.println(data[0]);    
            System.out.println(data[1]);
        }
        
        /*結果
        Person [pid=p1, name=p111]
        ClassInfo [cid=c111, name=banji1]
        Person [pid=p2, name=p222]
        ClassInfo [cid=c111, name=banji1]
        Person [pid=p3, name=p333]
        ClassInfo [cid=c222, name=banji2]
        Person [pid=p4, name=p444]
        ClassInfo [cid=c222, name=banji2]
        Person [pid=p5, name=p555]
        null
         * */
        tx.commit();
        s.close();
        sf.close();
    }
    
    
    /*返回的是整個Person類里有的所有屬性*/
    private static void fetchJoin() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    
        String hql = "select p from Person p left join fetch p.ci c ";
        Query q = s.createQuery(hql);

        List<Person> list = q.list();
        for(Person p: list){
            System.out.println(p);    
            System.out.println(p.getCi().getName());
        }
        
        /*結果:
        Person [pid=p1, name=p111]
        banji1
        Person [pid=p2, name=p222]
        banji1
        Person [pid=p3, name=p333]
        banji2
        Person [pid=p4, name=p444]
        banji2
        Person [pid=p5, name=p555]
         * */
        tx.commit();
        s.close();
        sf.close();
    }
}

 

 

/*以上個人整理筆記,如果有誤或者有不懂的地方,歡迎評論與指出*/


免責聲明!

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



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