最近项目中使用到Hql查询,单实体查询自然是easy的,当涉及到一些相对多的关联时,查询的方式一时想不清楚使用那种方式了,是用子查询还是关联呢,他们区别么,下面咱们就来看看。
整个实体
多属性 (对象数组,对象数组长度,属性个数)
多属性,类(运用构造函数,有参数)
我们先来看两个实体的关系图,一对多关系
:查询考试或简单的查询考试考场安排
Hql:FROM Examination a WHERE a.id=:id
Hql: (select e.id,e.examinationName from Examination ).list();
使用类构造函数,前提是该类必须是有参数的构造函数
Hql: (select new Examination (id,examinationName ) from Examination ).list();以上是简单的单实体操作,接下来说的是多实体连接查询
Hibernate和Jpa不显示指定连接条件,而是指定被映射java类关联的名称,通过一个外键约束名称表达连接条件,而且隐士连结采用多对一或一对一关联,是不通过集合的关联的。
如:查询在考试安排实体中查询考试名称是某个考试的安排信息。
Hql: FROM ExaminationRoomArrangement g WHEREg.examination.examinationName=:examinationName
以上查询没有连结任何实体,而是将考试实体的属性与考场安排全部映射到响应的实体中。返回的是一个List的包含所有属性的集合
若要指定的属性,则需要添加行select属性如:
Select g.examinationRoomState from ExaminationRoomArrangement g where g.examination.examinationName=:examinationName
返回的则一个包含了ExaminationRoomArrangement所有属性的数组集合。
有内联或外联
内联: from ExaminationRoomArrangement g join g.examination e where e.examinationName=: examinationName
该语句并没有返回一个List的ExaminationRoomArrangement ,而是数组集合,object[] 索引0是 examination, 1是ExaminationRoomArrangement
这个关联主要还是用于两个实体之间没有实际的主外键关联,通过where子句的一个条件来进行组合
如:用户User和 LogRcord 实体类,没有主外键关联但是要查询记录
Hql:from User user,LogRcord log where user.username=log.username
该语句返回的是两个实体的所有属性,当然也可使用select投影选择关注的属性
通过以上分析,对Hql的查询有了基本的认识,综合起来还是对Sql的精简封装,对于连接的这三种方式说起来还是与Sql的内外全连接想通,只是在一些语法上有细微的差别。
原文地址:http://blog.csdn.net/han_yankun2009/article/details/45227173