一、HQL的一对多查询

班级(1)->(多)学生

/**
* 实现Classes与Student的内连接
*
* SELECT c.*,s.*
* from classes c INNER JOIN student s
* where (c.cid=s.cid)
*/
@Test
public void testInnerJoin(){
session = HibernateUtils.openSession(); Query query = session.createQuery("from Classes c " +
"inner join c.students s ");
List list = query.list();//Object[]
session.close();
} /**
* 迫切内连接
*/
@Test
public void testInnerJoin_fetch(){
session = HibernateUtils.openSession(); Query query = session.createQuery("from Classes c " +
"inner join fetch c.students s ");
List list = query.list();//Classes
session.close();
} /**
* 左外连接
* SELECT c.*,s.*
* from classes c LEFT OUTER JOIN student s
* on(s.cid=c.cid)
*/
@Test
public void testLeftOutJoin(){
session = HibernateUtils.openSession(); Query query = session.createQuery("from Classes c " +
"left outer join c.students s ");
List list = query.list();//Object[]
session.close();
}
/**
* 迫切左外连接
*
*/
@Test
public void testLeftOutJoin_fetch(){
session = HibernateUtils.openSession(); Query query = session.createQuery("from Classes c " +
"left outer join fetch c.students s ");
List list = query.list();//Classes
session.close();
} /**
* 要查询的属性来自两个持久化类
* 注意:带构造函数的查询不能 与 带fetch的查询同一时候存在
* 使用 fetch:是希望带Classes
*
*/
@Test
public void testQueryPropertyFromTwo(){
session = HibernateUtils.openSession();
List<ClassStuView> classStuViews = session.createQuery("select new cn.cil.domain.ClassStuView(c.name,s.name) " +
" from Classes c inner join c.students s").list();
session.close();
}

二、HQL的多对多查询

学生(多)->(多)课程

/**
* 迫切内连接
*
*/
@Test
public void testInnerJoin_Fetch(){
Session session = sessionFactory.openSession();
session.createQuery("from Student s inner join fetch s.courses c").list();
session.close();
} /**
* 迫切左外连接
*/
@Test
public void testLeftOuterJoin_Fetch(){
Session session = sessionFactory.openSession();
session.createQuery("from Student s left outer join fetch s.courses c").list();
session.close();
}

三、一对多与多对多结合

班级(1)->(多)学生->(多)课程

/**
* 查询全部的班级的全部的学生的全部的课程
*/
@Test
public void testQuery1(){
Session session = HibernateUtils.openSession();
List<Classes> classes = session.createQuery("from Classes c inner join " +
"fetch c.students s inner join " +
"fetch s.courses cc").list();
session.close();
} @Test
public void testQuery2(){
Session session = HibernateUtils.openSession();
List<Student> classes = session.createQuery("from Student s inner join fetch s.classes c inner join fetch s.courses cc").list();
session.close();
}

有用场景:

用户登录系统,推断该用户所拥有的权限。并进行显示权限范围内的菜单

依据username查用户依据用户查角色再依据角色查权限

createQuery("from Privilege p inner join fetch p.roles r inner join fetch r.users u where u.username=?")

当表与表之间的关系过于复杂的时候,就不能使用hibernate了,hql的书写会相当相当麻烦,能够採用视图来解决这一问题。使用JDBC拼SQL

Hibernate学习笔记(十) — HQL查询的更多相关文章

  1. HIbernate学习笔记5 之 查询

    一.HQL查询 * 按条件查询,条件中写的是属性名,之后在query对象为添加赋值,如: String hql = " from User where uid=?"; Sessio ...

  2. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  3. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  4. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  5. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  6. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  7. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  8. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

随机推荐

  1. pkgadd 软件安装二种方法

    安装文件 pkgadd -d /soft/top-3.6.1-sol10-x86-local 安装目录文件: pkgadd -d ./ SUNWi1cs SUNWi15cs

  2. iframe动态改变内嵌页面高度

    test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w ...

  3. 6. python 字符串格式化表达式

    6. python 字符串格式化表达式 字符串格式化允许在一个单个的步骤中对一个字符串执行多个特定类型的替换 特别是给用户提示的时候,格式化非常方便 实现方法: 1.格式化表达式,类似于c语言的pri ...

  4. springboot2.X集成HttpClient 发送HTTPS 请求

    1)jar <!--httpclient 发送外部https/http 请求--> <dependency> <groupId>org.apache.httpcom ...

  5. pytest文档24-fixture的作用范围(scope)

    fixture作用范围 fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function fixture( ...

  6. DB2与Sybase/Oracle/Informix的比较

    DB2是IBM的数据库产品,近年来Oracle.Sybase等数据库的大力发展曾使很多人认为DB2将逐步退出数据库市场,但几年过去了,DB2不但没有退出的迹象,反而一步步发展壮大,逐步夺回失去的市场. ...

  7. 【ContestHunter】【弱省胡策】【Round5】

    反演+FFT+构造+DP 写了这么多tag,其实我一个也不会 A 第一题是反演……数据范围10W,看着就有种要用FFT等神奇算法的感觉……然而蒟蒻并不会推公式,只好写了20+10分的暴力,然而特判30 ...

  8. leetcode笔记:Same Tree

    一. 题目描写叙述 Given two binary trees, write a function to check if they are equal or not. Two binary tre ...

  9. [1] 平面(Plane)图形的生成算法

    顶点数据的生成 bool YfBuildPlaneVertices ( Yreal width, Yreal length, Yreal height, Yuint slices, Yuint sta ...

  10. [转]VS2010快捷键

    VS2010的快捷键,后附VS2008的快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...