------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客讲述命名查询,所谓命名查询是什么呢?
Hibernate中允许我们在xml,实体类,甚至注解的方式来编写查询语句,本篇博客将讲述xml中的方式
一,准备好准备工作,我由于上篇博客把大量的准备都做好,所以,本篇从简
二,预览hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.dawn.day05.entity"> <!--如果上面指定package的话,class的name就不必写全类名--> <!--lazy:是否懒加载(延迟加载) 默认值是true,延迟加载--> <!--<class name="Teacher">--> <!--直接加载--> <class name="Emp" lazy="false"> <!--主键--> <id name="empId" column="empId"> <!--主键生成策咯 assigned程序员自己创建--> <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值--> <!--increment是先查最大的主键列,在下一条给主键加一--> <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>--> <generator class="assigned"></generator> </id> <property name="name"/> <property name="sal"/> <property name="job"/> <!--table指的是中间表,承载关联关系的表--> <!--另外与他有多对多关联的实体类--> <many-to-one name="dept" column="deptNo" class="Dept"/> </class> <!--hql--> <!--HQL命名查询--> <query name="getAllEmps"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ from Emp ]]> </query> <!--SQL命名查询,返回的是一个Object数据--> <sql-query name="getAllEmpsBySql"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp ]]> </sql-query> <!--查询中携带条件--> <sql-query name="getAllEmpById"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp where empId=:id ]]> </sql-query> <!--查询返回一个对象--> <sql-query name="getEmpObject"> <return-scalar column="empId"/> <return-scalar column="name"/> <return-scalar column="sal"/> <return-scalar column="job"/> <!--但是无法绑定关联对象--> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp where empId=:id ]]> </sql-query> </hibernate-mapping>
三,查全部使用HQL语句(用命名查询)
1.在xml中使用到的方法是这个:
<!--hql--> <!--HQL命名查询--> <query name="getAllEmps"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ from Emp ]]> </query>
此处需要注意的就是<![CDATA[ ]]>这个标签,它表示不以关键字的形式编译里面的字符,例如<小于号在xml不以尖括号的形式编译
2.单测方法:
@Test /*HQL命名查询*/ public void t1HQLnamedquery(){ List<Emp> emps = session.getNamedQuery("getAllEmps").list(); for (Emp emp:emps){ System.out.println(emp); } /* Hibernate: select emp0_.empId as empId1_1_, emp0_.name as name2_1_, emp0_.sal as sal3_1_, emp0_.job as job4_1_, emp0_.deptNo as deptNo5_1_ from Emp emp0_ Hibernate: select dept0_.deptId as deptId1_0_0_, dept0_.name as name2_0_0_, dept0_.location as location3_0_0_ from Dept dept0_ where dept0_.deptId=? Hibernate: select dept0_.deptId as deptId1_0_0_, dept0_.name as name2_0_0_, dept0_.location as location3_0_0_ from Dept dept0_ where dept0_.deptId=? Emp{empId=1, name='a', job='财务猿1', sal=10000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}} Emp{empId=2, name='Ab', job='财务猿2', sal=5000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}} Emp{empId=3, name='bAa', job='财务猿3', sal=6000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}} Emp{empId=4, name='aaA', job='程序猿1', sal=100000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}} Emp{empId=5, name='aB', job='程序猿2', sal=50000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}} Emp{empId=6, name='AC', job='程序猿3', sal=60000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}} Emp{empId=7, name='AD', job='Boss', sal=5000000.0, dept=null} * */ }
四,查全部使用SQL语句(用命名查询)
1.xml中
<!--SQL命名查询,返回的是一个Object数据--> <sql-query name="getAllEmpsBySql"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp ]]> </sql-query>
2.单测方法:
@Test /*SQL命名查询,返回的是一个Object数据*/ public void t2HQLnamequeryBySQL(){ List<Object[]> list=session.getNamedQuery("getAllEmpsBySql").list(); for(Object[] emp:list){ System.out.println(emp[0]);//id System.out.println(emp[1]);//name /*System.out.println(emp[2]);//sal*/ } /* Hibernate: select * from emp 1 a 2 Ab 3 bAa 4 aaA 5 aB 6 AC 7 AD * */ }
五,带条件查询(用命名查询,返回的是List<Object[]>)
1.xml中:
<!--查询中携带条件--> <sql-query name="getAllEmpById"> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp where empId=:id ]]> </sql-query>
2.单测方法:
@Test /*查询中携带条件*/ public void t3HQLnamedqueryByParamter(){ List<Object[]> list = session.getNamedQuery("getAllEmpById").setParameter("id", 1).list(); for(Object[] emp:list){ System.out.println(emp[0]);//id System.out.println(emp[1]);//name /*System.out.println(emp[2]);//sal*/ } /* Hibernate: select * from emp where empId=? 1 a * */ }
六,带条件查询,返回的是Object(使用命名查询)
1.xml中:
<!--查询返回一个对象--> <sql-query name="getEmpObject"> <return-scalar column="empId"/> <return-scalar column="name"/> <return-scalar column="sal"/> <return-scalar column="job"/> <!--但是无法绑定关联对象--> <!--这个符号表示不编译关键字,比如大于号小于号等--> <![CDATA[ select * from emp where empId=:id ]]> </sql-query>
2.单测方法:
@Test /*查询返回一个对象*/ public void t4HQLnamedqueryReturnOneObj(){ Query query = session.getNamedQuery("getEmpObject").setParameter("id", 1); /*把查询出来的结果集转换成指定的对象*/ query.setResultTransformer(Transformers.aliasToBean((Emp.class))); Emp emp = (Emp)query.uniqueResult(); System.out.println(emp); /* Hibernate: select * from emp where empId=? Emp{empId=1, name='a', job='财务猿1', sal=10000.0, dept=null} * */ }