一、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

最新文章

  1. C语言提供了几个标准库函数 itoa() atoi()
  2. EMV/PBOC 解析(二) 卡片数据读取
  3. Linux常见目录作用
  4. 实现单例模式C++版本
  5. 射频识别技术漫谈(23)——ISO15693的载波、调制与编码
  6. Log4j2 简明教程
  7. Unicode 与 Unicode Transformation Format(UTF,UTF-8 / UTF-16 / UTF-32)
  8. Android 5.0新控件——TextInputLayout
  9. windows下为qt msvc版本配置调试器
  10. CSS控制文字显示一行,超出显示省略号
  11. Leetcode 中Linked List Cycle 一类问题
  12. centos7下安装部署mongodb集群(副本集模式)
  13. MySQL优化(五) SQL 语句的优化 索引、explain
  14. 在VS2017上对C++项目进行单元测试
  15. Django 模板中 变量 过滤器的使用方法
  16. fopen的type的值的意思
  17. ArcGIS案例学习笔记4_1_水文分析
  18. POJ-3278.CatchThatCow(数字BFS最短路输出)
  19. Oracle性能问题sql调优脚本集
  20. easyui tree扩展tree方法获取目标节点的一级子节点

热门文章

  1. 【Nginx】ngx_event_core_module模块
  2. Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
  3. StringUtils类常用方法介绍
  4. int to string
  5. Flask 学习(二)路由
  6. 数学图形之Boy surface
  7. 【c语言】使用gumbo解析HTML
  8. 【Todo】React &amp; Nodejs学习 &amp;事件驱动,非阻塞IO &amp; JS知识栈:Node为主,JQuery为辅,Bootstrap &amp; React为辅辅,其他如Angular了解用途即可
  9. Informatica 常用组件Lookup缓存之四 使用不高速缓存的查找或静态高速缓存
  10. C/C++/Java 程序计时功能函数