HQL之多表查询(一对多和多对多)
一、一对多
//内链接,两种方式效果一样,查询的是两边都有的数据
SELECT c.cname,s.sname FROM classes c INNER JOIN student s ON s.cid=c.cid;
//左外连接,在内链接基础上,左边表有而右边表没有,两种方式等效;
SELECT c.* ,s.* FROM student s LEFT OUTER JOIN classes c ON s.cid=c.cid;
SELECT c.* ,s.* FROM student s LEFT JOIN classes c ON s.cid=c.cid;
//右外连接,在内链接基础上,右边有而左边无,两种方式等效;
SELECT c.* ,s.* FROM classes c RIGHT OUTER JOIN student s ON s.cid=c.cid;
SELECT c.* ,s.* FROM classes c RIGHT JOIN student s ON s.cid=c.cid;
/**
* 1.一对多
* sql:select c.*,s.* from classes c,student s where c.cid=s.cid;
* hql:from Classes c,Student s where c.cid=s.classes.cid,注意与上句的区别;
* 得到的list是object[],数组中的元素是Classes和Student对象;
*
*/
@Test
public void testOneToMany_EQ(){
Session session = sessionFactory.openSession();
Query query = session.createQuery( "from Classes c,Student s where c.cid=s.classes.cid");
List list = query.list();
System. out.println(query.list().size());
session.close();
}
/**
* 2.带属性的查询;
* list中装的是object[];
*/
@Test
public void testOneToMany_EQ_Property(){
Session session = sessionFactory.openSession();
Query query = session.createQuery( "select c.cname,s.sname from Classes c,Student s where c.cid=s.classes.cid");
query.list();
session.close();
}
/**
* 3.带属性查询,将查询结果封装成一个bean;
* 得到的list中装的是classView对象;
*/
@Test
public void testOneToMany_EQ_Property_Constructor(){
Session session = sessionFactory.openSession();
Query query = session.createQuery( "select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname) " +
"from Classes c,Student s where c.cid=s.classes.cid");
List list = query.list();
session.close();
}
/**
* 4.内连接
* 结果与例子1一样;
*/
@Test
public void testOneToMany_InnerJoin_Query(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Classes c inner join c.students s");
Query query = session.createQuery(buffer.toString());
query.list();
session.close();
}
/**
* 5.迫切内连接1:获取所有有学生的班级及班级下的学生;
* 要想得到的集合中装的Classes对象,对象中set集合中装student,可以使用迫切内链接。
*
*/
@Test
public void testOneToMany_InnerJoin_Fetch_Query_1(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Classes c inner join fetch c.students s");
Query query = session.createQuery(buffer.toString());
List list = query.list();
session.close();
}
/**
* 6.迫切内连接2
* 从学生端出发;
*/
@Test
public void testOneToMany_InnerJoin_Fetch_Query_2(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Student s inner join fetch s.classes c");
Query query = session.createQuery(buffer.toString());
query.list();
session.close();
}
/**
* 7.迫切内连接3:获取属性,封装结果;
* select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname)
* from Student s inner join fetch s.classes c;
* 上述的 hql语句会报错,因为from后面想要的结构和select想要的结构是冲突的,所以
如果在from后面加fetch,不能写select语句,如果加select,不能写fetch,两者只能选择其一
*
*/
@Test
public void testOneToMany_InnerJoin_Fetch_Query_Property(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
//下面的写法不对;
// buffer.append("select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname) " +
// " from Student s inner join fetch s.classes c");
//不要fetch;
buffer.append( "select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname) " +
" from Student s inner join s.classes c " );
Query query = session.createQuery(buffer.toString());
List list = query.list();
session.close();
}
/**
* 8.迫切左外连接
* 从班级出发,得到班级对应的学生
*/
@Test
public void testOneToMany_LeftJoin_Fetch(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Classes c left outer join fetch c.students s");
Query query = session.createQuery(buffer.toString());
List<Classes> list = query.list();
for (Classes classes : list) {
System. out.println("classes:" +classes.getCname());
Set<Student> students = classes.getStudents();
for (Student student : students) {
System. out.println(" student:" +student.getSname());
}
}
session.close();
}
/**
* 9.迫切左外连接2
* 从学生出发,得到对应的班级
*/
@Test
public void testOneToMany_RightJoin_Fetch(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Student s left outer join fetch s.classes ");
Query query = session.createQuery(buffer.toString());
List<Student> list = query.list();
for (Student student : list) {
System. out.println("student:" +student.getSname());
if (student.getClasses()!=null) {
System. out.println(" " +student.getClasses().getCname());
}
}
session.close();
}
|
/**
* 1.得到所有的学生以及其对应的课程
* 从学生端出发
* list装的是学生;
*/
@Test
public void testManyToMany_LeftJoin_Fecth(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Student s left outer join fetch s.courses");
Query query = session.createQuery(buffer.toString());
List list = query.list();
session.close();
}
/**
* 2.得到所有的课程及课程下对应的学生;
* list装的是课程
*/
@Test
public void testManyToMany_LeftJoin_Fecth_2(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Course c left outer join fetch c.students s");
Query query = session.createQuery(buffer.toString());
query.list();
session.close();
}
/**
* 3.一对多和多对多的结合
* 得到所有班级下的所有学生以及所有学生下的所有课程;
* 从班级出发
*/
@Test
public void testManyToManyAndOneToMany(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Classes c left outer join fetch" +
" c.students s left outer join fetch s.courses");
Query query = session.createQuery(buffer.toString());
List<Classes> classeList = query.list();
//去掉集合中的重复元素
Set<Classes> sets = new HashSet<Classes>(classeList);
classeList = new ArrayList<Classes>(sets);
System. out.println(classeList.size());
for(Classes classes:classeList){//遍历班级
System. out.println(classes.getCname());
Set<Student> students = classes.getStudents();//得到班级下的学生
for(Student student:students){//遍历学生
System. out.println(student.getSname());
Set<Course> courses = student.getCourses();
for(Course course:courses){//遍历学生下的课程
System. out.println(course.getCname());
}
}
}
session.close();
}
/**
* 从中间表出发,班级有学生,学生修课程,故从学生角度出发进行查询;
*/
@Test
public void testManyToManyAndOneToMany_2(){
Session session = sessionFactory.openSession();
StringBuffer buffer = new StringBuffer();
buffer.append( "from Student s left outer join fetch s.classes c
left outer join fetch s.courses cc");
Query query = session.createQuery(buffer.toString());
List<Student> studentList = query.list();
for(Student student:studentList){
System. out.println(student.getSname());
Classes classes = student.getClasses();
System. out.println(classes.getCname());
Set<Course> courses = student.getCourses();
for(Course course:courses){
System. out.println(course.getCname());
}
}
session.close();
}
/*******************************************************************************/
/**
* 面向对象的查询
*/
@Test
public void testQueryCriteria(){
Session session = sessionFactory.openSession();
List<Classes> classesList = session.createCriteria(Classes.class).list() ;
System. out.println(classesList.size());
session.close();
}
@Test
public void testQueryCriteria_Where(){
Session session = sessionFactory.openSession();
Classes classes = (Classes)session.createCriteria(Classes.class).add(Restrictions.eq("cid" , 1L)).uniqueResult();
System. out.println(classes.getCname());
session.close();
}
}
|
HQL之多表查询(一对多和多对多)的更多相关文章
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- django ORM模型表的一对多、多对多关系、万能双下划线查询
一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...
- Mybatis_resultMap的关联方式实现多表查询(一对多)
a)在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息. b)通过<resultMap>定义映射关系, 并通过<c ...
- 2.1、Hibernate多表操作--一对多、多对一、多对多。
一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...
- Mybatis表关联一对多、多对一、多对多
项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...
- django(八)之数据库表的一对多,多对多表-增删改查
单表操作 表记录的添加 方式一: Book() b=Book(name="python基础",price=99,author="yuan",pub_date=& ...
- SSH框架的多表查询和增删查改 (方法一)中
原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html 这边文章是接的刚刚前一遍的基础上敲的 ...
- Django多表查询
一.前言 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...
- .NetCore中EFCore的使用整理(二)-关联表查询
EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core 1.1 1.当前的版本,还不支持延迟加载(Lazy ...
随机推荐
- dip,px,pt,sp的区别
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...
- mysql忘记root密码
skip-grant-tables:非常有用的mysql启动参数 介绍一个非常有用的mysql启动参数—— --skip-grant-tables.顾名思义,就是在启动mysql时不启动grant-t ...
- 16.2.13 asp.net 学习随笔
using System.Data.SqlClient;//连接数据库必须的 using System.Configuration; CommandType所在的命名空间 system.data; P ...
- Sky数[HDU2097]
Sky数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- codevs 1507酒厂选址
#include<cstdio> #include<cstdlib> using namespace std; int n; int dis[10010],a[10010],x ...
- MySQL安装问题:Unable to update security settings解决方案
主要问题还是之前装过,卸载的时候卸载不干净导致的. 如下: 安装到最后出现: Unable to update security settings. Access denied for user 'r ...
- startInstrumentation asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
由于手头上一直没有android level 17及以上版本的手机,有一个shell命令启动脚本的BUG,发生在SDK level 17及以上 API>=17中加入了INTERACT_ACROS ...
- fireBug使用指南
据说,对于网页开发人员来说,Firebug是Firefox浏览器中最好的插件之一. 我最近就在学习怎么使用Firebug,网上找到一篇针对初学者的教程,感觉比较有用,就翻译了出来. ========= ...
- 使用Python中的urlparse、urllib抓取和解析网页(一)(转)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- C# int转byte[],byte[]转int
第一种方法: byte数组转int u = (uint)(b[0] | b[1] << 8 |b[2] << 16 | b[3] << 24); int转byte数 ...