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. 使用urllib和http.cookiejar获取python老男孩学员成绩

    打开http://crm.oldboyedu.com/crm/grade/single/ 鼠标右键查看源代码,可以看到我们需要post的name.如下: 这里需要在post试提交token和searc ...

  2. 阿里云Centos 7上面安装mysql教程

    1 软件的基本安装过程 1 卸载已有的mysql 1.查看系统是否安装了mysql软件 rpm -qa|grep -i mysql 2.将已经安装过的软件卸载掉.注意:这样的卸载是不彻底,不过这里够用 ...

  3. 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...

  4. UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息

    应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...

  5. Js COOkie 读取

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. 再写一篇ubuntu服务器的环境配置文

    三年前写过一篇,但是环境和三年前比已经发生了比较大的变化,于是重新写一篇,自己以后再次配置也比较方便.我个人而言并没有觉得centos比ubuntu好用多少,所以继续选用ubuntu. 一.硬盘分区  ...

  7. 使用Spring的AOP实现切面日志

    AOP切面日志的使用方式 @Aspect @Component public class HttpAspect { private static final Logger logger = Logge ...

  8. Android-视图绘制

    http://blog.csdn.net/guolin_blog/article/details/16330267 任何一个视图都不可能凭空突然出现在屏幕上,它们都是要经过非常科学的绘制流程后才能显示 ...

  9. C# tcp udp 串口 通信

    简单的实现tcp同步和异步,udp,串口通信 static List<TcpClientState> clientArray = new List<TcpClientState> ...

  10. C++中char*与wchar_t*之间的转换

    http://blog.163.com/tianshi_17th/blog/static/4856418920085209414977/ 关于C++中的char*与wchar_t*这两种类型的相互转换 ...