zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

  • 相关阅读:
    详细解说python垃圾回收机制
    Vue-- 监听路由参数变化,数据无法更新 解决方案
    解决“只能通过Chrome网上应用商店安装该程序”的方法 ---离线安装谷歌浏览器插件
    axios POST提交数据的三种请求方式写法
    axios POST提交数据的三种请求方式写法
    vue+element后台系统 自己动手撸(一)
    element-ui中 table表格hover 修改背景色
    解决vue的{__ob__: observer}取值问题
    Vue [__ob__: Observer]取不到值问题的解决
    VUE监听路由变化的几种方式
  • 原文地址:https://www.cnblogs.com/Sunny-lby/p/7412418.html
Copyright © 2011-2022 走看看