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();
    }
}

 

 

/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/

转载于:https://www.cnblogs.com/Sunny-lby/p/7412418.html