zoukankan      html  css  js  c++  java
  • hibernate多表查询

    一对多进行查询(用懒加载的模式)

    查找区域所对应的街道:

    Dao:

    public Qu selQu(String dno){
            Session session=HibernateSessionFactory.getSession();
            Transaction tr=session.beginTransaction();
            Qu qu=null;
            try {
                qu=(Qu)session.load(Qu.class, dno);
                tr.commit();
            } catch (Exception e) {
                // TODO: handle exception
                tr.rollback();
            }
            return qu;    
    }

    test:

        public static void getDistinct(){
            Dao dao=new Dao();
            String dno="bj-dc";
            try {
                Qu qu=dao.selQu(dno);
                System.out.println(qu.getDno()+"-----"+qu.getName());
                Set<Jiedao> jiedaoset=qu.getJiedaos();
                for(Jiedao j:jiedaoset){
                    System.out.println(j.getSno()+"-----"+j.getName());
                }
            } catch (Exception e) {
                // TODO: handle exception
            }finally {
                HibernateSessionFactory.closeSession();
            }
        }

    inner join fetch查询

    查找街道所对应的区域:

    dao:

    public List<Qu> getQu(String jName){
            Session session=HibernateSessionFactory.getSession();
            String hql="from Qu q inner join fetch q.jiedao j where j.name=?";
            Query query=session.createQuery(hql);
            query.setString(0,jName);
            
            return query.list();
    }

    test:

        public static void getQu(){
            String str="繁荣路";
            Dao dao=new Dao();
            List<Qu> list=dao.getQu(str);
            for(Qu u:list){
                System.out.println(u.getDno()+","+u.getName());
            }
            HibernateSessionFactory.closeSession();
        }

    多对一添加数据(同时添加街道(多)和区域(一)的数据)

    dao:

        public void addManyToOne(Qu qu,Set<Jiedao> set){
            Session session=HibernateSessionFactory.getSession();
            Transaction tr=session.beginTransaction();
            
            try {
                session.save(qu);
                for(Jiedao j:set){
                    session.save(j);
                }
                tr.commit();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }

    test:

        public void addManyToOne(){
            Dao dao=new Dao();
            
            Qu qu=new Qu();
            qu.setDno("ed");
            qu.setName("二道区");
            
            Jiedao jd1=new Jiedao();
            jd1.setSno("ed1");
            jd1.setName("二道街1");
            jd1.setQu(qu);
            
            Jiedao jd2=new Jiedao();
            jd2.setSno("ed2");
            jd2.setName("二道街2");
            jd2.setQu(qu);
            
            Set<Jiedao> set=new HashSet<Jiedao>();
            set.add(jd1);
            set.add(jd2);
            
            dao.addManyToOne(qu, set);
        }

    一对多添加数据(同时添加区域(一)和街道(多)的数据)

    这里的dao层与多对一相同,省略不写,只更改test:

        public void addOneToMany(){
            Dao dao=new Dao();
            
            Qu qu=new Qu();
            qu.setDno("ed");
            qu.setName("二道区");
            
            Jiedao jd1=new Jiedao();
            jd1.setSno("ed1");
            jd1.setName("二道街1");
            
            
            Jiedao jd2=new Jiedao();
            jd2.setSno("ed2");
            jd2.setName("二道街2");
            
            
            Set<Jiedao> set=new HashSet<Jiedao>();
            set.add(jd1);
            set.add(jd2);
            
            qu.setJiedaos(set);
            
            dao.addManyToOne(qu, set);
        }

    注意:还需要在一的XML中把inverse改成false.

    inverse:表示反向,是set集合的属性。

    当inverse="true" 代表关系是由多方来维护的,也就是由街道方来维护的。

    当inverse="false"代表由一方来维护多关系,也就是由区域方来维护关系。

    这里我们要从区域方来添加街道中的数据,所以我们把这里改成inverse="false"

    多表查询(查询出所有区域对应的街道的信息)

    dao:

        public List<Jiedao> getAllJiedao(){
            List<Jiedao> list=new ArrayList<Jiedao>();
            
            String hql="from Jiedao j inner join j.qu";
            Session session=HibernateSessionFactory.getSession();
            Query query=session.createQuery(hql);
            Iterator it=query.iterate();
            while(it.hasNext()){
                Object [] obj=(Object [])it.next();
                Jiedao jiedao=(Jiedao)obj[0];
                Qu qu=(Qu)obj[1];
                list.add(jiedao);
            }
            return list;
        }

     test:

        public void getAllJiedao(){
            Dao dao=new Dao();
            List<Jiedao> list=dao.getAllJiedao();
            for(Jiedao j:list){
                System.out.println(j.getSno()+"-----"+j.getName());
            }
            HibernateSessionFactory.closeSession();
        }
  • 相关阅读:
    易耗品管理 第三四表 查询的存储过程
    [zz]使用vc编译libsvm
    程序调试小bug
    Ubuntu下安装配置OpenNI, OpenCV
    关于Linux下使用OpenCv读取视频打不开的问题
    jQuery实现图片点击放大
    关于 QtDBus 的种种
    javascript计时器的实现
    [QT]没有选择Debug构建方式.为文件的某行设置断点可能会失败
    linux firefox 不显示英文的解决
  • 原文地址:https://www.cnblogs.com/lm970585581/p/7273999.html
Copyright © 2011-2022 走看看