Java自学笔记之Hibernate-HQL多表查询一对多

前言:实体类Student.java Classes.java HIbernate测试工具类HibernateUtils.java 和上一篇博客一样,在此不再重复http://blog.csdn.net/tsfx051435adsl/article/details/77410879

新增加的实体类ClassesView.java

package com.web0819;

public class ClassesView {

    private String cname;
    private String sname;
    public ClassesView(String cname, String sname) {
        super();
        this.cname = cname;
        this.sname = sname;
    }
    @Override
    public String toString() {
        return "ClassesView [cname=" + cname + ", sname=" + sname + "]";
    }

}

HQL一对多测试类HQLTest.java

package com.web0819;

import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Test;

public class HQLTest {

    @Test
    public void test1() {
        Session session = HibernateUtils.getSessionFactory().openSession();
        System.out.println(session);
    }

    /**
     * 实现classes与student的内连接
     * Hibernate: 
    select
        classes0_.cid as cid1_0_0_,
        students1_.sid as sid1_1_1_,
        classes0_.name as name2_0_0_,
        students1_.cid as cid3_1_1_,
        students1_.name as name2_1_1_ 
    from
        classes classes0_ 
    inner join
        student students1_ 
            on classes0_.cid=students1_.cid
     */
    @Test
    public void testInnerJoin(){
        Session session =HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Classes c inner join c.students").list();
        for (Object object : list) {
//          System.out.println((Classes)object);  会报错java.lang.ClassCastException 说明list里面不是Classes对象
        }
        session.close();
    }


    /**
     * 迫切内连接
     * Hibernate: 
    select
        classes0_.cid as cid1_0_0_,
        students1_.sid as sid1_1_1_,
        classes0_.name as name2_0_0_,
        students1_.cid as cid3_1_1_,
        students1_.name as name2_1_1_,
        students1_.cid as cid3_0_0__,
        students1_.sid as sid1_1_0__ 
    from
        classes classes0_ 
    inner join
        student students1_ 
            on classes0_.cid=students1_.cid
     */
    @Test
    public void testInnerJoin_fetch(){
        Session session = HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Classes c inner join fetch c.students").list();
        for (Object object : list) {
            System.out.println((Classes)object);// 这个就不会报错 说明list里面不是Classes对象
        }
        session.close();
    }
    @Test
    public void testInnerJoin_fetch2(){
        Session session = HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Student s inner join fetch s.classes").list();
        for (Object object : list) {
            System.out.println((Student)object);// 这个就不会报错 说明list里面是Student对象
        }
        session.close();
    }
    /*
     * 左外连接
     * select c.*,s.*
            from classes c left outer join student s on(s.cid=c.cid)
        Hibernate: 
    select
        classes0_.cid as cid1_0_0_,
        students1_.sid as sid1_1_1_,
        classes0_.name as name2_0_0_,
        students1_.cid as cid3_1_1_,
        students1_.name as name2_1_1_ 
    from
        classes classes0_ 
    left outer join
        student students1_ 
            on classes0_.cid=students1_.cid
     */
    @Test
    public void testLeftJoin(){
        Session session = HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Classes c left outer join c.students").list();
        for (Object object : list) {
//          System.out.println((Classes)object); 会报错java.lang.ClassCastException,说明List里面不是Classes对象
        }
        session.close();
    }
    /**
     * 迫切左外连接
     * Hibernate: 
    select
        classes0_.cid as cid1_0_0_,
        students1_.sid as sid1_1_1_,
        classes0_.name as name2_0_0_,
        students1_.cid as cid3_1_1_,
        students1_.name as name2_1_1_,
        students1_.cid as cid3_0_0__,
        students1_.sid as sid1_1_0__ 
    from
        classes classes0_ 
    left outer join
        student students1_ 
            on classes0_.cid=students1_.cid
     */
    @Test
    public void testLeftJoin_fetch(){
        Session session = HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Classes c left outer join fetch c.students").list();
        for (Object object : list) {
            System.out.println((Classes)object); // 不会报错 说明list里面是Classes对象
             Set<Student> students = ((Classes)object).getStudents();
             for (Student student : students) {
                 System. out.println("student:" +student.getName());
            }
        }
        session.close();
    }

    @Test
    public void testLeftJoin_fetch2(){
        Session session = HibernateUtils.getSessionFactory().openSession();
        List list = session.createQuery("from Student s left outer join fetch s.classes").list();
        for (Object object : list) {
            System.out.println((Student)object); // 不会报错
        }
        session.close();
    }
    /**
     * 
      * sql:select c.*,s.* from classes c,student s where c.cid=s.cid;
      * hql:from Classes c,Student s where c.cid=s.classes.cid,注意与上句的区别;
      * 得到的list是object[],数组中的元素是Classes和Student对象;
     */
    @Test
    public void testOneToMany_EQ(){
        Session  session = HibernateUtils.getSessionFactory().openSession();
        Query query = session.createQuery( "from Classes c,Student s where c.cid=s.classes.cid");
        List list = query.list();
        for (Object object : list) {
            System.out.println(((Object[])object)[0]);
            System.out.println(((Object[])object)[1]);
        }
        session.close();
    }

    /**
     * 2.带属性的查询;
     * list中装的是object[];
     */
    @Test
    public void testOneToMany_EQ_Property(){
         Session   session = HibernateUtils.getSessionFactory().openSession();
        Query query = session.createQuery( "select c.name,s.name from Classes c,Student s where c.cid=s.classes.cid");
        List list = query.list();
        for (Object object : list) {
            System.out.println(((Object[])object)[0]);
            System.out.println(((Object[])object)[1]);
        }
        session.close();
    }
    /**
     * 3.带属性查询,将查询结果封装成一个bean;
     * 得到的list中装的是classView对象;
     */
    @Test
    public void testOneToMany_EQ_Property_Constructor(){
        Session   session = HibernateUtils.getSessionFactory().openSession();
        Query query = session.createQuery( "select new com.web0819.ClassesView(c.name,s.name) " +
               "from Classes c,Student s where c.cid=s.classes.cid");
        List<ClassesView> list = query.list();
        for (ClassesView classesView : list) {
            System.out.println(classesView);
        }
        session.close();
    }
    /*
    * 7.迫切内连接3:获取属性,封装结果;
    * select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname)
    *   from Student s inner join fetch s.classes c;
    * 上述的 hql语句会报错,因为from后面想要的结构和select想要的结构是冲突的,所以
        如果在from后面加fetch,不能写select语句,如果加select,不能写fetch,两者只能选择其一
    *
    */
   @Test
   public void testOneToMany_InnerJoin_Fetch_Query_Property(){
        Session   session =  HibernateUtils.getSessionFactory().openSession();
        StringBuffer buffer = new StringBuffer();
         //下面的写法不对;
        //      buffer.append("select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname) " +
        //               " from Student s inner join fetch s.classes c");
         //不要fetch;
        buffer.append( "select new com.web0819.ClassesView(c.name,s.name)  " +
         "  from Student s inner join s.classes c " );
           Query query = session.createQuery(buffer.toString());
           List<ClassesView> list = query.list();
           for (ClassesView classView : list) {
            System.out.println(classView);
           }
           session.close();
   }
   /**
    * 9.迫切左外连接2
    * 从学生出发,得到对应的班级
    */
   @Test
   public void testOneToMany_RightJoin_Fetch(){
        Session   session = HibernateUtils.getSessionFactory().openSession();
        StringBuffer buffer = new StringBuffer();
        buffer.append( "from Student s left outer join fetch s.classes ");
       Query query = session.createQuery(buffer.toString());
       List<Student> list = query.list();

       for (Student student : list) {
             System. out.println("student:" +student.getName());
             if (student.getClasses()!=null) {
                 System. out.println("     " +student.getClasses().getName());
            }
        }

       session.close();
   }
   /**
    * 8.迫切左外连接
    * 从班级出发,得到班级对应的学生
    */
   @Test
   public void testOneToMany_LeftJoin_Fetch(){
        Session   session = HibernateUtils.getSessionFactory().openSession();
        StringBuffer buffer = new StringBuffer();
        buffer.append( "from Classes c left outer join fetch c.students s");
       Query query = session.createQuery(buffer.toString());
       List<Classes> list = query.list();

       for (Classes classes : list) {
             System. out.println("classes:" +classes.getName());
            Set<Student> students = classes.getStudents();
             for (Student student : students) {
                 System. out.println("     student:" +student.getName());
            }
        }

       session.close();
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值