------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客讲述命名查询,所谓命名查询是什么呢?
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} ???????* */ ???}
Hibernate-ORM:14.Hibernate中的命名查询
原文地址:https://www.cnblogs.com/DawnCHENXI/p/9141422.html