hql:一对多和多对多的结合

其中,一对多和多对多面临着2种问题,一种是结构的问题,另外一种是内容的问题,我们只能在这二者选其一,选择了结构,就可能会出现我们需要的字段比查找出来的字段少得多,当然,这种情况,只能借助懒加载。如果选择了另外一种情况,可能会出现表的结构不同问题,我们自己创建的javaBean要先通过转换,才能调用dao操作数据库。

当我们查找数据的时候,如果关联到很多张表,那么应该怎样查找,查找那张表效率更高呢?

查找中间表效率比较高,因为效率高的数据库,把表都设计成星形,而不是饼状。
这里写图片描述
图中信息与本文无关,只是讨论一下表的结构。
各个部分的核心表之间都有连接。
所以我们说要查找中间表,效率较高。

Session session=sessionFactory.openSession();
        //在这里以student为主(以哪个类为主,就以哪个类先写到from的后面)
        String hql="from Student s left outer join fetch s.classes c1 left outer join fetch s.courses c2";
        List<Student> students=session.createQuery(hql).list();
        session.close();
        return students;

如果查的是以中心表Student的集合的话,里面既有classes属性,又有courses的属性,遍历起来比较方便。

<!-- 
    遍历list<Student<classes,set<Courses>>>
 -->
    <s:iterator value="#students">
        <s:property value="sname"/><br/>
        <!-- 
            因为list<Student>里面,有classes类,也有set<Course>集合,
            classes可以看成是里面的一个属性,
            set就要另外迭代了。
            由于当前迭代对象在栈顶,所以我们遍历set的时候,不用加#号
         -->
        <s:property value="classes.cname"/>
        <s:iterator value="courses">
            <s:property value="cname"/>
        </s:iterator>
    </s:iterator>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值