SQL多表操作分类;

1.交叉连接:select*from t_customer cross Join t_order;

2.显示内连接: select*from t_customer c inner join t_order o on c.id=o.c_customer_id;

 隐示内连接:select*from t_customer c ,t_order o WHERE c.id=o.c_customer_id; where可消除笛卡尔积

笛卡尔积是两个表任意组合,查询出两表全部的组合,但我们只想查询某一种组合,加where限制条件可消除笛卡尔积.

3.外链接:select*from t_customer c left join t_order o ON c.id=o.c_customer_id;左外:把左边的全部显示出来.

Hql多表操作分类:

1.交叉连接 ::select*from t_customer cross Join t_order;

2.内连接

a) 显示内连接:       b) 隐式内连接      c) 迫切内连接

//显示内连接---结果Customer的id=1的属性,order属性;Customer的id=1的属性,order属性
@Test
public void test010(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
String hql="from Customer c inner join c.orders with c.id=1";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object );
}
}
session.getTransaction();
session.close();
}
//隐示内连接----消除了笛卡尔迪.它是通过"."运算符来关联.
@Test
public void test011(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
String hql="from Order o where o.c.id=1";
Query query = session.createQuery(hql);
List list = query.list();
System.out.println(list); session.getTransaction();
session.close();
}
//迫切内连接(立即加载)----distinct c 消除了笛卡尔迪,迫切内连接得到的结果是直接封装到po类,而内连接得到的结果是Object[],数组中封装的po类.
@Test
public void test012(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//底层也是inner join,只不过把结果封装到对象中.
String hql=" select distinct c from Customer c inner join fetch c.orders "; Query query = session.createQuery(hql);
List<Customer> list = query.list();//集合中装入的是from后面的对象
for (Customer c : list) {
System.out.println(c);
}
session.getTransaction();
session.close();
}

3.外连接

1)左外连接           2)迫切左外连接               3)右外连接

//外链接
@Test
public void test013(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//底层也是inner join,只不过把结果封装到对象中.
String hql=" from Customer c left join c.orders ";
Query query = session.createQuery(hql);
List<Object[]>list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object+"\t");
}
System.out.println();
}
session.getTransaction();
session.close();
}
//迫切左外链接
@Test
public void test014(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//底层也是inner join,只不过把结果封装到对象中.
String hql=" select distinct c from Customer c left join fetch c.orders where c.id=1";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
/*for (Customer c : list) {
System.out.println(c);
}*/
System.out.println(list);
session.getTransaction();
session.close();
}

注意:在Hibernate中有迫切连接,在sql中没有.

Hibernate多表查询连接操作的更多相关文章

  1. [刘阳Java]_MyBatis_其他方式来实现多表查询的操作_第9讲

    MyBatis其他方式来实现多表查询的操作 利用Java中的集合框架(List,Map) 其中List存储多个查询返回的记录 Map查询返回字段,同时记录表中一条数据 <?xml version ...

  2. Mysql-单表查询的操作和注意事项

    一. 单表查询的语法 二 .关键字的执行优先级(重点) 三 .简单查询 四 .WHERE约束 五. 分组查询:GROUP BY 六 .HAVING过滤 七 .查询排序:ORDER BY 八 .限制查询 ...

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

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

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

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

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

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

  6. 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

    /* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

  7. ORM基础4 跨表查询+原子性操作

    一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...

  8. MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)

    先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...

  9. hibernate多表查询

    一对多进行查询(用懒加载的模式) 查找区域所对应的街道: Dao: public Qu selQu(String dno){ Session session=HibernateSessionFacto ...

随机推荐

  1. shell 对字符的求长

    一,测试环境 echo "To the world you may be one person but to one person you may be the world" 对于 ...

  2. LeetCode 200.岛屿的个数

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  3. 022-pinyin4j工具类模板

    模板一 package ${enclosing_package}; import java.util.Arrays; import net.sourceforge.pinyin4j.PinyinHel ...

  4. bzoj 5329: [Sdoi2018]战略游戏

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  5. c#-FrameWork02泛型

    泛型 l  泛型(generic)编程是一种编程范式,它利用”参数化类型”将类型抽象化,从而可以实现更为灵活的复用.把数据类型参数化 sh泛型集合 泛型集合与集合的对比 泛型集合类 非泛型集合类 Li ...

  6. 网页生命周期-PageLoad事件

    PageLoad事件的作用 l 页面载入是执行的处理命令 l 可以动态创建控件 l 可以设置现有控件的属性和状态 l 常用来设置数据库的连接 l 每次页面载入都会执行

  7. 正则表达式过滤联系方式,微信手机号QQ等

    有些输入不允许用户输入联系方式.可以使用以下正则表达式来判断是否输入敏感信息 var reg = new RegExp("(微信|QQ|qq|weixin|1[0-9]{10}|[a-zA- ...

  8. java集合框架(一):HashMap

    有大半年没有写博客了,虽然一直有在看书学习,但现在回过来看读书基本都是一种知识“输入”,很多时候是水过无痕.而知识的“输出”会逼着自己去找出没有掌握或者了解不深刻的东西,你要把一个知识点表达出来,自己 ...

  9. 使用HTML5 canvas做地图(2)瓦片以及如何计算的

    上一篇也说到瓦片,我们为什么使用瓦片?这一篇主要是关于如何拼接地图? 下面的一张图,可以一眼明了,地图是如何切割以及拼接的. 瓦片信息 瓦片信息包括切图原点,瓦片大小,格式,分辨率以及分辨率级别等. ...

  10. Java NIO(二) Channel

    Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Bu ...