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

查找区域所对应的街道:

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

hibernate多表查询的更多相关文章

  1. hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

    hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

  2. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  3. Hibernate多表查询、查询优化策略(四)

    多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...

  4. hibernate 多表查询

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  5. hibernate多表查询封装实体

    以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下.最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQ ...

  6. Hibernate多表查询连接操作

    SQL多表操作分类; 1.交叉连接:select*from t_customer cross Join t_order; 2.显示内连接: select*from t_customer c inner ...

  7. Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决

    Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...

  8. 【Hibernate 多表查询】

    HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...

  9. hibernate多表查询sql,以及所得对象的处理

    String sql ="SELECT id FROM tea WHERE tea.name=? "; SQLQuery query = this.getSession().cre ...

随机推荐

  1. iOS 开发中保留小数问题

    保留两位小数(四舍五入) - (void)viewDidLoad { [super viewDidLoad]; // 有时候我们需要对数据保留两位小数,而且需要四舍五入,并且需要把末尾多余的0给去掉\ ...

  2. PHP如何实现99乘法表?

    看到这个问题,可能大家更多的是考虑到用for循环,个人觉得使用for循环太影响程序性能.推荐使用递归处理.  /** * Title : 递归实现99乘法表 * Author : Bruceqi * ...

  3. YII2.0 获取当前访问地址/IP信息

    假设我们当前页面的访问地址是:http://localhost/CMS/public/index.php?r=news&id=1 一. 1.获取当前域名:echo Yii::app()-> ...

  4. Source Insight的使用

    1. source insight查看函数的上一级调用的位置(函数) --> 鼠标放在函数上,右键 选择 Jump To caller,就可以看到有哪些函数调用它了:

  5. docker配置与实践#可以好好看看

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 L ...

  6. Ruby字符串的一些方法

    最近因为公司需求开始看ruby,先从ruby的基本数据类型开始看 看到ruby的字符串类型string,发现ruby中的字符串单双引号是不一样的,这点和Python有那么点不一样 主要是我们对字符串进 ...

  7. [BZOJ2809][Apio2012]dispatching(左偏树)

    首先对于一个节点以及它的子树,它的最优方案显然是子树下选最小的几个 用左偏树维护出每棵子树最优方案的节点,记录答案 然后它的这棵树可以向上转移给父节点,将所有子节点的左偏树合并再维护就是父节点的最优方 ...

  8. 【转】Python 数据库连接池

    python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因 ...

  9. HashMap源码注释翻译

    HashMap.java(JDK1.8) 如有错误翻译的地方,欢迎评论指出. 介绍:对于HashMap及其子类而言,它们采用Hash算法来决定集合中元素的存储位置.当系统开始初始化HashMap时,系 ...

  10. linux 操作之一 如何在linux将本地数据*.sql文件导入到linux 云服务器上的mysql数据库

    liunx 版本ubuntu 16.4 mysql 版本  5.6 1)准备*.sql文件 (* 是准备导入的sql文件的名字) 2)liunx 远程客户端  SecureCRT 7.0 alt+p ...