一级级联到处都是,直接上2级级联吧。
三个表,user,grade,school。
学生关联年级,年级关联学校。现在我想查出user的同时知道他所在的班级和学校!
User.hbm.xml
<hibernate-mapping>
<class name="com.supben.pojo.User" table="User">
<id name="userId" type="java.lang.Long">
<column length="20" name="userId" />
<generator class="identity"></generator>
</id>
<property name="userName" type="java.lang.String">
<column name="userName" />
</property>
<many-to-one name="grade" column="gradeId" class="com.supben.pojo.Grade" />
</class>
</hibernate-mapping>
Grade.hbm.xml
<hibernate-mapping>
<class name="com.supben.pojo.Grade" table="grade">
<id name="gradeId" type="java.lang.Integer">
<column length="20" name="gradeId"/>
<generator class="identity"></generator>
</id>
<property name="gradeName" type="java.lang.String">
<column name="gradeName"/>
</property>
<many-to-one name="school" column="schoolId" class="com.supben.pojo.School"/>
</class>
</hibernate-mapping>
School.hbm.xml
<hibernate-mapping>
<class name="com.supben.pojo.School" table="school">
<id name="schoolId" type="java.lang.Integer">
<column length="20" name="schoolId"/>
<generator class="identity"></generator>
</id>
<property name="schoolName" type="java.lang.String">
<column name="schoolName"/>
</property>
</class>
</hibernate-mapping>
qbc查询方法
@SuppressWarnings("unchecked")
public List<User> find3Table() {
Criteria c = userDao.createCriteria();
//添加user表的查询字段
c.add(Restrictions.eq("userName", "supben"));
//添加grade表的关联,并指定别名为grade
c.createAlias("grade","grade");
//添加grade表查询字段
c.add(Restrictions.eq("grade.gradeName", "101"));
//添加schoo表的关联,并指定别名为school
c.createAlias("grade.school","school");
//添加school表的查询字段
c.add(Restrictions.eq("school.schoolName", "宿松中学"));
//添加user表和school表互相关联的条件
c.add(Restrictions.eqProperty("userId", "school.schoolId"));
return c.list();
}
}
测试方法
public void testQBC(){
List<User> userList = userService.find3Table();
for (User user : userList){
System.out.println("姓名: "+user.getUserName());
System.out.println("班级: "+user.getGrade().getGradeName());
System.out.println("学校: "+user.getGrade().getSchool().getSchoolName());
}
说明:如果不涉及到从表中的字段的话,其实还有一种更简单的方法
@SuppressWarnings("unchecked")
public List<User> find3Table() {
Criteria c = userDao.createCriteria();
//立即用join的方法加载grade
c.setFetchMode("grade", FetchMode.JOIN);
//立即用join的方式加载school
c.setFetchMode("grade.school", FetchMode.JOIN);
//user表中的查询字段
c.add(Restrictions.eq("userName", "supben"));
return c.list();
}
问题的关键在哪:这样你添加不了班级表的条件来构建查询,类似于
c.add(Restrictions.eq("grade.gradeName", "101"));
一直报错说,无法解析user的grade.gradeName属性,必须要起别名!
或者是我没有找到,欢迎高手指教
分享到:
相关推荐
Java_Hibernate QBC条件查询对比
Hibernate QBC高级查询 大家放心收藏! saivixky出品!必属精品!
Hibernate_QBC查询
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
使用Hibernate的QBC查询,对数据库内容进行分页查询,在控制他显示,可跳转转的页面
收录了QBC_hibernate完整用法.大家可以下载看看.作为参考.
Hibernate criteria queris 条件查询(QBC)转 Hibernate QBC查询 QBC分页查询大全
NULL 博文链接:https://wfq5154.iteye.com/blog/1714952
Hibernate_QBC查询[归类].pdf
// 1.查询所有 // 2.条件查询 // 3.模糊查询 // 4.范围查询 // 5.排序查询(order by) // 6.分页查询 // 7.投影查询(只获取部分字段的结果) // 8.聚集函数使用(聚合函数)(count、sum、avg、max、min等) ...
Hibernate实例开发 HQL 与 QBC 查询
之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...
QBC的相关讲义和例题 QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。
QBC的各种查询,采用mvc多hibernate的封装,是很好的资料
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
NULL 博文链接:https://awfrun.iteye.com/blog/690632
一、Hibernate的引入 二、如何获取 三、第一个Hibernate项目 四、代码优化 五、使用Hibernate进行CRUD的操作 六、Hibernate主键生成策略(generator) ...十、QBC是Query By Criteria的缩写,QBC是面向对象的查询方法。
内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...
hibernate的注解开发 注解开发关联映射 HQL、QBC、本地SQL检索数据
hibernate查询,spring+hibernate