Hibernate HQL 一对多查询

来源:互联网 发布:分类信息群发软件 编辑:程序博客网 时间:2024/04/29 06:45

    1、等值连接:

/** * 等值查询          查询出来的结构很差   */public List<Classes> queryClasses_Student_EQ(){Session session = sessionFactory.openSession();List<Classes> cList = session.createQuery("from Classes c, Student s where c.cid=s.classes.cid").list();session.close();return cList;}

    2、内连接
/** * 内连接           这种结构也不好 */public List<Classes> queryClasses_Student_INNER(){Session session = sessionFactory.openSession();List<Classes> cList = session.createQuery("from Classes c inner join c.students").list();session.close();return cList;}

    3、迫切内连接:

/** * 迫切内连接          */public List<Classes> queryClasses_Student_INNER_FETCH(){Session session = sessionFactory.openSession();List<Classes> cList = session.createQuery("from Classes c inner join fetch c.students").list();session.close();return cList;}

    4、左外连接

/** * 左外连接 */public List<Classes> queryClasses_Student_LeftJoin(){Session session = sessionFactory.openSession();List<Classes> cList = session.createQuery("from Classes c left outer join c.students").list();session.close();return cList;}

    5、迫切左外连接

/** * 迫切左外连接 */public List<Classes> queryClasses_Student_LeftJoin_fetch(){Session session = sessionFactory.openSession();String hql = "from Classes c left outer join fetch c.students";hql = "from Student s left outer join fetch s.classes c";List<Classes> cList = session.createQuery(hql).list();session.close();return cList;}

    6、如果页面只需要某个属性(cname, sname)使用以下方法

          ·创建 JavaBen(ClassesView.java)

public  class ClassesView {private  String  cname;private  String  cname;public  ClassesView(String  cname,  String  sname){this.cname = cname;this.sname = sname;}封装……}
          ·在 HQLDao 中

                public List<Classes> queryClasses_Student_Select(){                    Session session = sessionFactory.openSession();                    String hql = "select new cn.itcast.hiberate.sh.domain.ClassesView(c.cname,s.sname) " +                                 "from Student s left outer join s.classes c";                    List<Classes> cList = session.createQuery(hql).list();                    session.close();                    return cList;                }

            注意:因为“迫切连接”的结构和“带构造函数”的机构有冲突,所以两者只能取其一。


    总结:
        1、如果“页面上的数据”和“DB中的字段相差甚远”,利用带select 的构造器进行查询
        2、如果页面上的数据和数据库中的字段相近,这是用迫切连接
        3、如果采用“迫切链接”,from 后紧跟的就是结构主体。
        4、如果多张表进行查询,找中间表。


0 0
原创粉丝点击