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

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11703.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论