Hibernate学习笔记(十) — HQL查询

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-14 22:54:55

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

《Hibernate学习笔记十》:多对多关联关系详解

<Hibernate学习笔记十>:多对多关联关系 前面介绍了一对一.多对一和一对多的关联关系在Hibernate应如何实现,这篇博文就来介绍下最后一种关联关系:多对多.多对多关联关系在我们现实生活中的例子实在是太多太多,最典型的就是老师和学生的例子:一个老师可以教多个学生,而一个学生又可以被多个老师来教. 了解一点数据库的我们都知道,在数据库中表示多对多的关联关系,是借助于中间表来解决的. 如下: 还是和以往的思路一样,每一种关联关系都分为单向关联和双向关联,我们每种都会进行介绍,对于单向和双

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

Sharepoint2013搜索学习笔记之自定义查询规则(十)

自定义查询规则,可以根据搜索的关键字将指定的一个或一堆搜索结果提升到第一的位置,如我搜索周杰伦,可以指定搜索最靠前的结果是sharepoint网站内周杰伦的视频如下图: 第一步,进入管理中心,点击管理应用程序,点击search service应用程序,进入搜索管理页面,点击查询规则 第二步,选择一个结果源,如sharepoint本地结果,然后点击新建查询规则,填好相应值, 第三步,点添加结果块编辑查询语句,然后保存. Sharepoint2013搜索学习笔记之自定义查询规则(十)

Swift学习笔记十:属性

1.存储属性       1. 作为特定类或结构实例的一部分,存储属性存储着常量或者变量的值.存储属性可分为变量存储属性(关键字var描述)和常量存储属性(关键字let描述). struct student{ let name = "" var score = 0 } let a = student(name:"小笨狼",score:96)           注意:                ① 定义储存属性时,需要为每一个属性定义一个默认值.在初始化的时候,

Hibernate学习笔记:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建 前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了.本篇博文将记录下第一个Hibernate程序的搭建过程.其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我

hibernate学习笔记之三(一级缓存的使用和管理)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 一级缓存 一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存.位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存. 一级缓存实现原理. session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr

hibernate学习笔记之二(初识hibernate)

(hibernate学习笔记系列来自于 "疯狂Java" 视频学习) Hibernate概述 免费开源Java包,可以使程序和数据库的交互变得容易,并更加符合面向对象的设计. 持久化:将数据保存到数据库中 hibernate持久化类步骤 环境搭建 导入jar包,在hibernate包里的\lib\required文件夹里 导入mysql的JDBC驱动 将上述包添加到路径里面 编写持久化类 要求: 在持久化类中一般需要一个id,通常用Integer类型,这样之后操作会使用null,而不是

hibernate学习笔记之三(单条记录的增删改查)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 保存用户 session.save(person); session.persist(person); 查询用户 load(Class theClass,Serializable id) get(Class theClass,Serializable id) 修改用户 session.update(person) session.merger(person); 保存或修改用户 session.sav