package org.niit.springhibernatelab.dao; import java.sql.SQLException; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hibernate.FetchMode; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions; import org.niit.springhibernatelab.entities.Depart; import org.niit.springhibernatelab.entities.Emp; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class DepartDao extends HibernateDaoSupport { /** 迫切左外连接 */ public void getDepart1() { List<Depart> departList = (List<Depart>) getHibernateTemplate() .find( "from Depart as d left join fetch d.emps as e where d.dname like ?", "%技术%"); for (Depart depart : departList) { System.out.println(depart.getDid() + "/t" + depart.getDname()); if (depart.getEmps().size() > 0) { System.out.println("-------------------------------------"); for (Emp e : depart.getEmps()) { System.out.println("/t" + e.getEid() + "/t" + e.getEname()); } } } } /** 迫切左外连接[过滤重复Depart对象] */ public void getDepart2() { List<Depart> departList = (List<Depart>) getHibernateTemplate() .find( "from Depart as d left join fetch d.emps as e where d.dname like ?", "%技术%"); Set<Depart> departSet = new HashSet<Depart>(departList); for (Depart depart : departSet) { System.out.println(depart.getDid() + "/t" + depart.getDname()); if (depart.getEmps().size() > 0) { System.out.println("-------------------------------------"); for (Emp e : depart.getEmps()) { System.out.println("/t" + e.getEid() + "/t" + e.getEname()); } } } } /** 迫切左外连接QBC[过滤重复Depart对象] */ public void getDepart3() { DetachedCriteria qbc = DetachedCriteria .forClass(Depart.class) .setFetchMode("this.emps",FetchMode.DEFAULT) .add(Restrictions.like("dname", "技术",MatchMode.START)); List<Depart> departList = (List<Depart>)getHibernateTemplate().findByCriteria(qbc); Set<Depart> departSet = new HashSet<Depart>(departList); for (Depart depart : departSet) { System.out.println(depart.getDid() + "/t" + depart.getDname()); if (depart.getEmps().size() > 0) { System.out.println("-------------------------------------"); for (Emp e : depart.getEmps()) { System.out.println("/t" + e.getEid() + "/t" + e.getEname()); } } } } /** * 左外连接[少了fetch],使用左外连接查询时,将根据映射文件的配置来决定emps集合的检索策略 * 返回的集合中的每个元素对应查询结果的一条记录,每个元素类型都是对象数组类型,数组的第一 * 个成员是部门对象,第二个成员是员工对象 * */ public void getDepart4(){ List<Object[]> elementList = (List<Object[]>) getHibernateTemplate() .find( "from Depart as d left join d.emps as e where d.dname like ?", "%技术%"); for(Object[] elements : elementList){ Depart d = (Depart)elements[0]; Emp e = (Emp)elements[1]; System.out.print(d.getDid()+"/t"+d.getDname()); if (e != null){ System.out.print("/t/t"+e.getEid()+"/t"+e.getEname()); } System.out.println(); } } /** * 左外连接[少了fetch],使用左外连接查询时,将根据映射文件的配置来决定emps集合的检索策略 * 返回的集合中的每个元素对应查询结果的一条记录,每个元素类型都是对象数组类型,数组的第一 * 个成员是部门对象,第二个成员是员工对象 * 只返回Depart对象的结合 * */ public void getDepart5(){ List<Depart> departList = (List<Depart>) getHibernateTemplate() .find( "select d from Depart as d left join d.emps as e where d.dname like ?", "%技术%"); Set<Depart> departSet = new HashSet<Depart>(departList); for (Depart depart : departSet) { System.out.println(depart.getDid()+"/t"+depart.getDname()); } } /**内连接 * 返回的集合中的每个元素对应查询结果的一条记录,每个元素类型都是对象数组类型,数组的第一 * 个成员是部门对象,第二个成员是员工对象 * */ public void getDepart6(){ List<Object[]> list = getHibernateTemplate().executeFind( new HibernateCallback() { @Override public Object doInHibernate(Session arg0) throws HibernateException, SQLException { return arg0 .createQuery("from Depart as d inner join d.emps as e where d.dname like :dname") .setParameter("dname","%技术%",Hibernate.STRING) .list(); } } ); for (Object[] objects : list) { Depart d = (Depart)objects[0]; Emp e =(Emp)objects[1]; System.out.println(d.getDid()+"/t"+d.getDname()+"/t/t"+e.getEid()+"/t"+e.getEname()); } } /**内连接 * 返回的集合中的每个元素对应查询结果的一条记录,每个元素类型都是对象数组类型,数组的第一 * 个成员是部门对象,第二个成员是员工对象 * 只返回Depart对象的结合 * */ public void getDepart7(){ List<Depart> list = getHibernateTemplate().executeFind( new HibernateCallback() { @Override public Object doInHibernate(Session arg0) throws HibernateException, SQLException { return arg0 .createQuery("select d from Depart as d inner join d.emps as e where d.dname like :dname") .setParameter("dname","%技术%",Hibernate.STRING) .list(); } } ); Set<Depart> departSet = new HashSet<Depart>(list); for (Depart d : list) { System.out.println(d.getDid()+"/t"+d.getDname()); } } /**内连接QBC * 返回部门对象的集合 * */ public void getDepart8(){ getHibernateTemplate().execute( new HibernateCallback() { @Override public Object doInHibernate(Session arg0) throws HibernateException, SQLException { // List<Depart> list = // arg0.createCriteria(Depart.class) // .add(Restrictions.like("this.dname", "%技术%",MatchMode.START)) // .createCriteria("emps") // .add(Restrictions.like("ename", "王",MatchMode.START)) // .list(); //下面的方式等效 List<Depart> list = arg0.createCriteria(Depart.class) .createAlias("emps","e") .add(Restrictions.like("this.dname", "%技术%",MatchMode.START)) .add(Restrictions.like("e.ename", "王",MatchMode.START)) .list(); for (Depart depart : list) { System.out.println(depart.getDid()+"/t"+depart.getDname()); } return null; } } ); } /**迫切内连接[QBC不支持] * 返回部门对象的集合 * */ public void getDepart9(){ getHibernateTemplate().execute( new HibernateCallback() { @Override public Object doInHibernate(Session arg0) throws HibernateException, SQLException { List<Depart> list = arg0 .createQuery("from Depart as d inner join fetch d.emps as e where d.dname like :dname") .setParameter("dname", "%技术%",Hibernate.STRING) .list(); Set<Depart> departSet = new HashSet<Depart>(list); for (Depart depart : departSet) { System.out.println(depart.getDid()+"/t"+depart.getDname()); if (depart.getEmps().size()>0){ for (Emp e : depart.getEmps()) { System.out.println("/t"+e.getEid()+"/t"+e.getEname()); } } } return null; } } ); } } package org.niit.springhibernatelab.dao; import java.sql.SQLException; import java.util.List; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.niit.springhibernatelab.entities.Depart; import org.niit.springhibernatelab.entities.Emp; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; public class EmpDao { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void getEmps(){ final Depart depart = new Depart(); depart.setDid(19); hibernateTemplate.execute( new HibernateCallback() { @Override public Object doInHibernate(Session arg0) throws HibernateException, SQLException { List<Emp> emps = arg0.createQuery("from Emp as e where e.depart =:depart") .setParameter("depart", depart,Hibernate.entity(Depart.class)) .list(); for (Emp emp : emps) { System.out.println(emp.getEid()+"/t"+emp.getEname()); } return null; } } ); } } Spring装配文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" name="dataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/crm"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> </props> </property> <property name="mappingResources"> <list> <value>org/niit/springhibernatelab/entities/Depart.hbm.xml</value> <value>org/niit/springhibernatelab/entities/Emp.hbm.xml</value> <value>org/niit/springhibernatelab/entities/Module.hbm.xml</value> <value>org/niit/springhibernatelab/entities/Role.hbm.xml</value> <value>org/niit/springhibernatelab/entities/Roleemp.hbm.xml</value> <value>org/niit/springhibernatelab/entities/Rolemodule.hbm.xml</value> </list> </property> </bean> <bean name="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean name="departDao" class="org.niit.springhibernatelab.dao.DepartDao" > <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean name="empDao" class="org.niit.springhibernatelab.dao.EmpDao"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> </beans> 测试类: package org.niit.springhibernatelab.dao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client1 { private static ApplicationContext appCxt = new ClassPathXmlApplicationContext("org/niit/springhibernatelab/dao/applicationContext.xml"); public static void main(String[] args) { DepartDao departDao = (DepartDao)appCxt.getBean("departDao"); //EmpDao empDao = (EmpDao)appCxt.getBean("empDao"); //departDao.getDepart1(); //departDao.getDepart2(); //departDao.getDepart3(); //departDao.getDepart4(); departDao.getDepart5(); //departDao.getDepart6(); //departDao.getDepart7(); //departDao.getDepart8(); //departDao.getDepart9(); //empDao.getEmps(); } }