读书人

Hibernate中HQL话语的使用

发布时间: 2013-02-17 10:44:46 作者: rapoo

Hibernate中HQL语句的使用

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

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

Dept.hbm.xml中

<hibernate-mapping package="com.tarena.demo.po"><class name="Dept" table="t_dept"><id name="did" column="did"><generator class="identity"></generator></id><property name="dname"></property><set name="emps" cascade="all" inverse="true"><key column="did"></key><one-to-many class="Emp"/></set></class></hibernate-mapping>


Emp.hbm.xml中

<hibernate-mapping package="com.tarena.demo.po"><class name="Emp" table="t_emp"><id name="eid" column="eid"><generator class="identity"></generator></id><property name="ename"></property><many-to-one name="dept" column="did" class="Dept"></many-to-one><query name="findEmpByEid"><![CDATA[from Emp where eid<?]]></query></class></hibernate-mapping>


测试类:

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


读书人网 >Web前端

热点推荐