通常有三种方法:
1.不写Hql,直接用对象导航的方式 。比如Set set=student.getCourses();//保证立即加载
2.将多对多关系转化为多对一和一对多关系,这个时候写hql比较清晰容易。
3.直接使用jdbc不过在正常的使用当中,使用第一种是最常见的。如果只是需要student中的一部分course,可以使用集合过滤即可完成功能。

解决方案 »

  1.   

    多对多关系肯定是两个一对多关联,即借助中间表完成,楼上的第1,2种方法本质上是一样的,第一种灵活性最差,不能处理分页我的问题是如何写多对多查询效率最高?
    比如 select in (select ...)
    还是连接查询效率高?因为in 实际上是或条件,效率很低,比and差不少
    连接查询没怎么深入研究所以也不知道该怎么连
      

  2.   

    其实是比较简单的,不要觉得多对多关系是Set而无从下手,实际上Set属性和String、int属性的操作是一样的。
       比如Student和Course是多对多的关系,假如要查出一个名为“tomclus”的所有选课,一般用两种方法:
       1.student.getCourses()//此student是tomclus
       2.使用HQL语句,如下的示例代码:
     Query q=session.createQuery("from Student s join fetch  s.courses where s.name='tomclus'");
                q.setFirstResult(0);
                q.setMaxResults(2);//只查询两条记录
                List list=q.list();
                Student stu=(Student) list.get(0);
                log.info(stu.getCourses().size());
    上述语句就可以用来分页。
    另外,使用集合过滤也可以实现多对多关系分页的功能,详细的内容请查看以下网址:
    http://www.redsaga.com/hibernate-ref/3.1.2/zh-cn/html/queryhql.html#queryhql-bulk