关于hibernate 联级查询数据的问题
我有一个系统,有级联操作,比如我一进入系统就要查询出当前登录的教师教了哪些年级,然后通过获取选择的年级再查询班级,然后根据班级再查询学生。有什么好的方法,优化sql,就是...
我有一个系统,有级联操作,比如我一进入系统就要查询出当前登录的教师教了哪些年级,然后通过获取选择的年级再查询班级,然后根据班级再查询学生。有什么好的方法,优化sql,就是能够把每次查询的数据能够保存起来,然后提供给下一次查询,缩减范围。项目框架式 spring +hibernate +easyui
展开
1个回答
展开全部
1,这个不叫级联操作,最多叫做关系关联查询;
2,优化的本质就是减少SQL,在你这个关系中,至少4个表有关联关系,所以,在查询教师的时候,使用LEFT JOIN FETCH把年级,班级和学生查询出来:
SELECT s FROM Teacher t LEFT JOIN FETCH t.grade g LEFT JOIN FETCH g.classes c LEFT JOIN FETCH c.students s WHERE t.id = ?
3,这样的查询性能还是不算太高,毕竟4个对象关联,不算中间表,所以,建议直接teacher对象里面增加一个student的关系,直接保存教师教授的学生;
4,如果教师和学生关系固定,也可以使用查询缓存,查询缓存在我个人说明里面有相关的资料,你可以看看。
希望对你有点用处。
2,优化的本质就是减少SQL,在你这个关系中,至少4个表有关联关系,所以,在查询教师的时候,使用LEFT JOIN FETCH把年级,班级和学生查询出来:
SELECT s FROM Teacher t LEFT JOIN FETCH t.grade g LEFT JOIN FETCH g.classes c LEFT JOIN FETCH c.students s WHERE t.id = ?
3,这样的查询性能还是不算太高,毕竟4个对象关联,不算中间表,所以,建议直接teacher对象里面增加一个student的关系,直接保存教师教授的学生;
4,如果教师和学生关系固定,也可以使用查询缓存,查询缓存在我个人说明里面有相关的资料,你可以看看。
希望对你有点用处。
追问
hibernate 级联查询与左联接等查询方式有什么区别
追答
这个可能是我比较抠字眼了,
级联:cascade,只代表save-update/delete/all/delete-orphan/all-delete-orphan这几个级练操作;
而你说的级联查询,我的理解是不是就是直接
SELECT a.b.c.d这种;
就是在HQL中,如果你直接使用“.”来导航关系的话,相当于JOIN(内联),当然和LEFT JOIN有区别,而且我这里写的LEFT JOIN FETCH代表的不仅仅是左联查询,这个是迫切左联,意思是你把Teacher查询出来,对应的student也都查询出来了。不会再延迟加载了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询