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