Hibernate中HQL语句的使用

本文主要使用一些测试方法来讲解HQL的具体应用

采用一对多的关系映射举例,两个类Dept{did,dname,emps},Emp{dept,eid,ename}

Dept.hbm.xml中


	
		
			
		
		
		
			
			
		
	


Emp.hbm.xml中


	
		
			
		
		
		
		
		
		
	


测试类:

public class TestHQL {
	
	/**
	 * Hibernate生成关系模型
	 */ 
	@Test
	public void test00DDL(){
		Configuration cfg = new Configuration().configure();
		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}
	@Test
	public void test01InitData(){
		//10个部门,30个员工	
		Session session = HibernateUtils.getSession();
		for(int i=1;i<=10;i++){
			Dept dept = new Dept();
			dept.setDname("部门"+i);
			Set emps = new HashSet();
			for(int j=1;j<=8;j++){
				Emp emp = new Emp();
				emp.setEname("员工_"+i+"_"+j);
				emp.setDept(dept);
				emps.add(emp);
			}
			dept.setEmps(emps);
			session.save(dept);
			session.clear();
		}
		session.beginTransaction().commit();
		HibernateUtils.close(session);
	}
	
	/**
	 * 查询属性
	 * 查询一个属性,集合中的数据类型为String(对于dname属性),
	 * 如果对于did属性,则是Integer类型
	 */
	@Test
	public void test02(){
		Session session = HibernateUtils.getSession();
		String hql = "select dname from Dept";
		Query query = session.createQuery(hql);
		List dnames = query.list();
		for (String dname : dnames) {
			System.out.println(dname);
		}
		HibernateUtils.close(session);
	}
	
	/**
	 * 查询多个属性,集合中数据的类型为Object[]
	 */
	@Test
	public void test03(){
		Session session = HibernateUtils.getSession();
		String hql = "select did,dname from Dept";
		Query query = session.createQuery(hql);
		List dnames = query.list();
		for (Object[] o : dnames) {
			System.out.println(o[0]+":"+o[1]);
		}
		HibernateUtils.close(session);
	}
	/**
	 * 查询多个属性,动态构建一个对象,Dept类必须要有new Dept(dname,did)构造器
	 * 和无参构造器
	 */
	@Test
	public void test04(){
		Session session = HibernateUtils.getSession();
		String hql = "select new Dept(did,dname) from Dept";
		Query query = session.createQuery(hql);
		List depts = query.list();
		for(Dept dept:depts){
			System.out.println(dept.getDname());
		}
		HibernateUtils.close(session);
	}
	
	/**
	 * 简单对象查询
	 * foreach迭代,如果迭代一个空值,如果从该对象获得方法,不会出现空指针异常
	 * 内部采用的是iterator,当it.hasNext()才进行。而如果是空值,it.hasNext()为false
	 * 不会执行该对象的方法,因此不会出现空指针异常。
	 */
	@Test
	public void test05(){
		Session session = HibernateUtils.getSession();
		String hql = "select d from Dept d";
		Query query = session.createQuery(hql);
		List depts = query.list();
		for(Dept dept:depts){
			System.out.println(dept.getDname()+","+dept.getDid());
		}
		HibernateUtils.close(session);
	}
	/**
	 * 对象查询,条件查询
	 * 参数的顺序从0开始
	 */
	@Test
	public void test06(){
		Session session = HibernateUtils.getSession();
		String hql = "select d from Dept d where dname=?";
		Query query = session.createQuery(hql);
		query.setString(0, "部门1");
		List depts = query.list();
		for (Dept dept : depts) {
			System.out.println(dept.getDname());
		}
		HibernateUtils.close(session);
	}
	
	/**
	 * 对象查询,条件查询
	 */
	@Test
	public void test07(){
		Session session = HibernateUtils.getSession();
		String hql = "select d from Dept d where dname=? and did=?";
		List depts = session.createQuery(hql).
			setString(0, "部门1").setInteger(1, 1).list();
		for (Dept dept : depts) {
			System.out.println(dept.getDname());
		}
		HibernateUtils.close(session);
	}
	
	/**
	 * 查询所有员工信息
	 * 分页查询
	 * setFirstResult();确定查询的起点
	 * setMaxResult();确定查询的条数
	 */
	@Test
	public void test08(){
		Session session = HibernateUtils.getSession();
		String hql = "from Emp";
		int currentPage = 5;
		int pageSize = 5;
		List emps = session.createQuery(hql).
			setFirstResult((currentPage-1)*pageSize).
				setMaxResults(pageSize).list();
		for (Emp emp : emps) {
			System.out.println(emp.getEname());
		}
		HibernateUtils.close(session);
	}
	
	
	/**
	 * 查询所有员工信息
	 * 查询最大页数
	 * 首先查询所有记录数
	 */
	@Test
	public void test09(){
		Session session = HibernateUtils.getSession();
		String hql = "select count(*) from Emp";
		List list = session.createQuery(hql).list();
		int rec = list.get(0).intValue();
		int pageSize = 7;
		System.out.println("最大页数为:");
		System.out.println(rec%pageSize == 0?rec/pageSize:rec/pageSize+1);
		HibernateUtils.close(session);
	}
	
	/**
	 * 使用命名查询
	 * 将hql语句写在映射文件中
	 * 查询ID号小于20的员工信息
	 * from Emp where eid<20
	 *  
		
		
		
		getNamedQuery(),获取Query对象
	 */
	@Test
	public void test10(){
		Session session = HibernateUtils.getSession();
		Query query = session.getNamedQuery("findEmpByEid");
		query.setInteger(0, 20);
		List emps = query.list();
		for (Emp emp : emps) {
			System.out.println(emp.getEid()+":"+emp.getEname());
		}
		HibernateUtils.close(session);
	}
	
	/**
	 * 在hibernate 中使用sql查询
	 * select * from t_emp;
	 */
	@Test
	public void test11(){
		Session session = HibernateUtils.getSession();
		String sql = "select * from t_emp";
		SQLQuery query = session.createSQLQuery(sql);
		List list = query.list();
		for (Object[] o : list) {
			System.out.println(o[0]+":"+o[1]+":"+o[2]);
		}
		HibernateUtils.close(session);
	}
	
}


 

 

你可能感兴趣的:(hibernate)