hibernate多表查询

2020-09-03 11:18:12 浏览数 (1)

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

查找区域所对应的街道:

Dao:

代码语言:javascript复制
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:

代码语言:javascript复制
    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:

代码语言:javascript复制
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:

代码语言:javascript复制
    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:

代码语言:javascript复制
    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:

代码语言:javascript复制
    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:

代码语言:javascript复制
    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:

代码语言:javascript复制
    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:

代码语言:javascript复制
    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();
    }

0 人点赞