一对多进行查询(用懒加载的模式)
查找区域所对应的街道:
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