Hibernate查询

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1Hibernate查询中科软培训部2目标•Hibernate的检索策略•Hibernate的检索方式3•检索策略的作用域–类级别检索策略•检索的数据只包含一个类的对象,不涉及关联–关联级别检索策略•检索的数据包含相关联的多个类的对象•如:找到一个Customer对象,还有与之关联的Orders对象检索策略的一些概念——检索策略的作用域4DROPTABLEIFEXISTS`customer`;CREATETABLE`customer`(`cid`int(11)NOTNULLauto_increment,`cname`varchar(11)defaultNULL,`csex`varchar(11)defaultNULL,`cage`int(11)defaultNULL,PRIMARYKEY(`cid`))ENGINE=InnoDBDEFAULTCHARSET=gbk;INSERTINTO`customer`VALUES(1,'Mike','男',22);INSERTINTO`customer`VALUES(2,'Jack','男',21);INSERTINTO`customer`VALUES(3,'Linda','女',24);INSERTINTO`customer`VALUES(4,'Tom','女',29);INSERTINTO`customer`VALUES(5,'张一','男',5);DROPTABLEIFEXISTS`orders`;CREATETABLE`orders`(`oid`int(11)NOTNULLauto_increment,`cid`int(11)defaultNULL,`odate`datedefaultNULL,`order_number`varchar(11)defaultNULL,PRIMARYKEY(`oid`),KEY`customer_order_fk`(`cid`))ENGINE=InnoDBDEFAULTCHARSET=gbk;INSERTINTO`orders`VALUES(1,1,'2007-03-05','O-0001');INSERTINTO`orders`VALUES(2,1,'2007-03-06','O-0002');INSERTINTO`orders`VALUES(3,2,'2007-03-06','O-0003');INSERTINTO`orders`VALUES(4,3,'2007-03-06','O-0004');INSERTINTO`orders`VALUES(5,4,'2007-04-06','O-0005');5检索策略的一些概念——检索策略•检索策略–立即检索•立即加载检索方法指定的对象•立即将数据加载到缓存中–延迟检索•延迟加载检索方法指定的对象•不立即将数据加载到缓存,要访问的时候才加载–迫切左外连接检索•使用外连接检索数据•不仅指定查询方式,还指定关联级别的检索策略6类级别的检索策略•类级别的检索策略包括–立即检索–延迟检索•默认检索策略–在Hibernate2.x中,默认为立即检索–在Hibernate3.x中,默认为延时检索•设置方法(pojo.hbm.xml)classlazy=“true”:真的很懒-延迟检索classlazy=“false”:假的很懒-立即检索7类级别的检索策略——立即检索•配置方法classname=“com.sinosoft.Customer”table=“Customer”lazy=“false”/class•只会影响load()方法–get()方法总是执行立即检索,而不管lazy的值如何–Query.list()方法总是执行立即检索,而不管lazy的值如何•示例Customerc=(Customer)session.load(Customer.class,newInteger(1));//System.out.println(c.getCname());第2个语句不管有没有,都会通过select语句将数据找出来8类级别的检索策略——延迟检索•配置方法classname=“com.sinosoft.Customer”table=“Customer”lazy=“true”/class•只会影响load()方法.get()方法总是执行立即检索,而不管lazy的值如何•示例Customerc=(Customer)session.load(Customer.class,newInteger(1));//System.out.println(c.getCname());•说明•如果第2个语句执行,则会从数据库中找回数据,并存储到Session缓存中•如果第2个语句不执行,则不会从数据库取数据,返回的只是Customer类的代理类的实例•代理类在运行时动态生成,继承了持久化类(此处为Customer)所有属性和方法•仅初始化OID属性,其他属性为null•如果只是得到OID的值,不从DB中加载数据,否则加载9关联级别的检索策略•set元素的检索策略•many-to-one元素的检索策略10set元素的检索策略——示例•setname=orderslazy=“trueouter-join=“falsekeycolumn=cid/keyone-to-manyclass=com.sinosoft.Orders/•/set•执行语句:–Customerc=(Customer)session.load(Customer.class,newInteger(1));–System.out.println(c.getCname());lazyouter-join检索策略falsefalse采用立即检索,不左外连接fasletrue采用立即检索,采用迫切左外连接检索truefalse采用延迟检索,不左外连接truetrue采用延迟检索,左外连接(这是默认的)11many-to-one元素的检索策略12Hibernate的检索方式•Hibernate提供的检索方式–导航对象图检索方式–OID检索方式–HQL检索方式–QBC检索方式–本地SQL检索方式13HQL检索方式•HibernateQueryLanguage•HQL是面向对象的查询语言–语法和SQL相似•表名→类名•字段名→属性名•必须为类名取别名,通过别名引用属性.在HQL中,别名其实就是类的对象.•HQL使用最广14HQL的功能•条件查询•投影查询•分页查询•连接查询•分组查询•聚焦查询•子查询•动态绑定参数15HQL基本查询方法•创建Query对象–Queryquery=session.createQuery(fromCustomerasowhereo.cid=:cid);•动态绑定参数(如果需要)•query.setInteger(“cid,1);•执行查询,返回查询结果–Listlist=query.list();16HQL条件查询•使用where来设定查询条件–Where子句中给出的是对象的属性名,而不是字段名–如:查询名叫张三的客户fromCustomerascwherec.cname=‘张三’17HQL条件查询——比较运算•检索年龄大于18的Customer对象–FromCustomercwherec.age18•检索年龄不等于18的Customer对象–FromCustomercwherec.age18•检索姓名为空的Customer对象–FromCustomercwherec.nameisnull•检索姓名为Tom的Customer对象–FromCustomercwherelower(c.name)=‘tom’18HQL条件查询——范围运算•检索姓名为tom,mike,jack的Customer对象–FromCustomercwherec.namein(‘tom’,’mike’,’jack’)•检索年龄在18~25之间的Customer对象–FromCustomercwherec.agebetween18and25•检索年龄不在18~25之间的Customer对象–FromCustomercwherec.agenotbetween18and2519HQL条件查询——模糊查询•检索姓名以T开始的Customer对象–FromCustomercwherec.namelike‘T%’•检索姓名中包含字符串“om”的Customer对象–FromCustomercwherec.namelike‘%om%’•检索姓名以T开头,并且字符串长度为3的Customer对象–FromCustomercwherec.namelike‘T__’20HQL条件查询——逻辑运算•检索姓名以T开头,并且以m结尾的Customer对象–FromCustomercwherec.namelike‘T%’andc.namelike‘%m’•检索姓名以T开头,并且以m结尾,或者年龄在18~25之间的Customer对象–FromCustomercwhere(c.namelike‘T%’andc.namelike‘%m’)or(c.agebetween18and25)21投影查询——过滤部分字段•返回的List集合元素为Object[]–Stringhql=selectc.cname,c.cageFromCustomerasc;–ListObject[]cusList=session.createQuery(hql).list();–for(Object[]obj:cusList){–System.out.println(obj[0]+:+obj[1]);–}HQL语句是不是有点不一样?22分页查询•Queryquery=session.createQuery(fromCustomerc);•query.setFirstResult((当前页-1)*页大小);//从哪儿开始取•query.setMaxResults(页大小);//最多取多少条记录•Iteratoriter=query.list().iterator();•Customerc=null;•while(iter.hasNext()){–c=(Customer)iter.next();–System.out.print(c);•}23连接查询——多表连接连接类型HQL语法内连接innerjoin或者join迫切内连接innerjoinfetch或者joinfetch左外连接leftouterjoin或者leftjoin迫切左外连接leftouterjoinfetch或者leftjoinfetch右外连接rightouterjoin或者rightjoin迫切连接不仅指定了查询方式,也指定了关联级别的检索策略24连接查询——迫切左外连接•Queryquery=session.createQuery(fromCustomercleftjoinfetchc.orderso);•Iteratoriter=query.list().iterator();•说明:–关键字:leftjoinfetch–返回结果为Customer类型,再通过Customer对象导航到Orders对象–返回结果可能包含重复元素,通过Set去掉重复行25连接查询——左外连接•Queryquery=session.createQuery(fromCustomercleftjoinc.orderso);•Iteratoriter=query.list().iterator();•说明:–关键字:leftjoin–返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders–没有重复元素26连接查询——内连接•Queryquery=session.createQuery(fromCustomercinnerjo

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功