Hibernate多表查询连接操作
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多表查询连接操作的更多相关文章
- [刘阳Java]_MyBatis_其他方式来实现多表查询的操作_第9讲
MyBatis其他方式来实现多表查询的操作 利用Java中的集合框架(List,Map) 其中List存储多个查询返回的记录 Map查询返回字段,同时记录表中一条数据 <?xml version ...
- Mysql-单表查询的操作和注意事项
一. 单表查询的语法 二 .关键字的执行优先级(重点) 三 .简单查询 四 .WHERE约束 五. 分组查询:GROUP BY 六 .HAVING过滤 七 .查询排序:ORDER BY 八 .限制查询 ...
- Hibernate多表查询、查询优化策略(四)
多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
/* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...
- MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...
- hibernate多表查询
一对多进行查询(用懒加载的模式) 查找区域所对应的街道: Dao: public Qu selQu(String dno){ Session session=HibernateSessionFacto ...
随机推荐
- shell 进阶之匹配字符串
一,操作字符串 1,字符串长度 expr 命令取字符串函数 自带shell函数读取 2,匹配字符串开头字串的长度 !!!!!!!!!!!!$substring是正则表达式.!!!!!!!!! ...
- Android 中判断网络状态
首先在AndroidManifest.xml添加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_ ...
- Mysql系列-字符集
字符集 怎样选择合适的字符集 如果应用程序需要发布到很多国家和地区,需要支持各种各样的文字,则选择Unicode编码,Mysql中即UTF-8.q如果需要将数据导入数据库,这时候要注意数据库字符集对数 ...
- 【卷土重来之C#学习笔记】(三) 类的基本概念
1.类的概述 程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类. 类是一个能存储数据并执行代码的数据结构. 它包含数据成员和函数成员: 数据成员:存储与类或类的实例相关数 ...
- Halcon学习笔记——机器视觉应用工程开发思路及相机标定
机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...
- 继承Application管理生命周期
继承Application实现Android数据共享 http://www.jianshu.com/p/75a5c24174b2 jessyan提出一个思路,用Application + 接口来管理扩 ...
- 如何把php项目部署到阿里云服务器window server2012__含公网ip访问时jquery/ajax失效解决办法
记一次蛋疼的折腾. 弄了一晚上最后发觉是360浏览器的问题,换个浏览器就好了.垃圾360用什么IE7文档模式.导致界面和功能失效. 建议大家测试的时候用firefox或者chrome. 项目部署到服务 ...
- BZOJ2438: [中山市选2011]杀人游戏(tarjan)
题意 题目链接 Sol 这题挺考验阅读理解能力的.. 如果能读懂的话,不难发现这就是在统计有多少入度为\(0\)的点 缩点后判断一下即可 当然有一种例外情况是\(1 -> 3, 2 -> ...
- Nodejs 如何制作命令行工具
# 全局安装,安装报错是需要前面加上sudo $ sudo npm install -g xxxb # 输出帮助 $ xxxb -h Usage: xxxb 这里是我私人玩耍的命令哦![options ...
- 类数组转数组Array.prototype.slice.call(arrayLike)
转换方式:Array.prototype.slice.call(arrayLike) 附:(http://www.jianshu.com/p/f8466e83cef0) 首先Array.prototy ...