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

查找区域所对应的街道:

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. VC中edit控件使用

    SetSel(start,end)作用:定制EDIT的所选择内容.间接地可以用于定位光标位置. 使用例子:EXP1:设置光标CEdit*      pEdit=(CEdit*)GetDlgItem(I ...

  2. javascript--select标签的添加删除功能的使用

    在网页开发中,常常遇见这种问题,给定两个框,A和B,和几个图片按钮,A中存在几个操作,点击图片按钮,填加至B中,或者从B中移除等,这种效果如何实现,本文加以总结. 几种效果图如下: 原始图:      ...

  3. thinkphp验证码实现。

    作为我大天朝的程序员,如果不会点thinkphp框架确实有点说不过去了(虽然作为菜鸟的我才入坑没几个月).不过不会也没关系,很简单的一个php框架.今天为大家介绍的是thinkphp如何实现验证码的功 ...

  4. Vue2+VueRouter2+webpack+vue-cil构建完整项目实例(附:详细步骤截图)

    引用1:https://segmentfault.com/a/1190000008557578 引用2:https://blog.csdn.net/wulala_hei/article/details ...

  5. Hadoop(5)-Hive

    在Hadoop的存储处理方面提供了两种不同的机制,一种是之前介绍过的Hbase,另外一种就是Hive,有关于Hbase,它是一种nosql数据库的一种,是一种数据库,基于分布式的列式存储,适合海量数据 ...

  6. 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  7. Rmarkdown:输出html设置

    在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...

  8. C语言运算符优先级和结合性

    运算符优先级和结合性 优先级                                       运算符 结合性                                         ...

  9. java练习题——类与对象

    一.请依据代码的输出结果,自行总结Java字段初始化的规律 public static void main(String[] args) { InitializeBlockClass obj=new ...

  10. 在WPF中自定义控件(2) UserControl

    原文:在WPF中自定义控件(2) UserControl 在WPF中自定义控件(2) UserControl                                               ...