Hibernate HQL 一对多查询

    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、如果多张表进行查询,找中间表。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值