Hibernate学习笔记(十) — HQL查询
2024-08-26 12:47:08
一、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
最新文章
- C语言提供了几个标准库函数 itoa() atoi()
- EMV/PBOC 解析(二) 卡片数据读取
- Linux常见目录作用
- 实现单例模式C++版本
- 射频识别技术漫谈(23)——ISO15693的载波、调制与编码
- Log4j2 简明教程
- Unicode 与 Unicode Transformation Format(UTF,UTF-8 / UTF-16 / UTF-32)
- Android 5.0新控件——TextInputLayout
- windows下为qt msvc版本配置调试器
- CSS控制文字显示一行,超出显示省略号
- Leetcode 中Linked List Cycle 一类问题
- centos7下安装部署mongodb集群(副本集模式)
- MySQL优化(五) SQL 语句的优化 索引、explain
- 在VS2017上对C++项目进行单元测试
- Django 模板中 变量 过滤器的使用方法
- fopen的type的值的意思
- ArcGIS案例学习笔记4_1_水文分析
- POJ-3278.CatchThatCow(数字BFS最短路输出)
- Oracle性能问题sql调优脚本集
- easyui tree扩展tree方法获取目标节点的一级子节点
热门文章
- 【Nginx】ngx_event_core_module模块
- Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
- StringUtils类常用方法介绍
- int to string
- Flask 学习(二)路由
- 数学图形之Boy surface
- 【c语言】使用gumbo解析HTML
- 【Todo】React &; Nodejs学习 &;事件驱动,非阻塞IO &; JS知识栈:Node为主,JQuery为辅,Bootstrap &; React为辅辅,其他如Angular了解用途即可
- Informatica 常用组件Lookup缓存之四 使用不高速缓存的查找或静态高速缓存
- C/C++/Java 程序计时功能函数