前边我们讲过了Hibernate的检索策略,即Hibernate在从数据库中查询出持久化对象的时机(什么时候将关联对象查询出来),方式(是否在查询当前对象时将关联对象查询出来)和数量(一次查询查出多少关联对象)。在具体的使用中,我们从类级别的查询策略(注意在hbm.xml文件中的lazy属性来决定load方法是否懒加载)、双向一对多和双向多对多的关联关系(这两种关联关系是通过hbm.xml文件中的set节点来使用的,所以我们针对set节点的三个属性来改变Hibernate的检索策略,lazy,fetch,batch-size),单向多对一和双向一对一的关联关系(同样的也有以上类似的lazy属性作用于many-to-one和one-to-many节点从而改变Hibernate的检索策略)。
今天我们来讲一讲Hibernate的检索方式,不同于检索策略的是,检索方式指的是在查询数据对象时,采用的获取对象的方式或者说采用了途径获取了数据对象。
1.常见的获取数据对象的方式
① 通过对象导航图语言,即通过已经获得的对象来间接获取想要的对象:customers.getOrders()
② 通过OID获取想要的对象:如get和load方法
③ 通过HQL的检索方式:HQL是一种面向对象的查询语言
④ QBC检索方式:使用QBC的API来检索对象,这种API封装了基于字符串形式的查询语句,提供了面向对象程度更高的查询接口。
⑤ 本地SQL检索方式:使用本地数据库的SQL查询语句
2.HQL的检索方式
① HQL是一种面向对象的查询语言,与SQL语言及其相似,唯一不同的是,SQL语句中面向和使用的是表和字段,而HQL中面向和使用的是类和属性。
② 在Hibernate提供的查询语句中,HQL是一种最广泛使用的查询方式
③ HQL语言支持:查询条件where、投影查询(仅查询类对象的部分属性)、分页查询、连接查询、分组查询(即可以使用group by /having by)、提供内置的聚集函数(sum/avg等)、支持子查询、支持动态绑定参数(即可以使用具名参数)、可调用用户定义的SQL函数和标准的SQL函数。
④HQL的检索步骤
通过session建立一个Query对象(内含一个String类型的HQL查询语句),然后设置这个HQL查询语句的动态参数,然后执行Query对象的list()查询方法来执行查询操作即可。
⑤ 需要注意的是,Query对象的接口支持方法链编程风格,例如setXxx()方法返回的是这个Query实例的本身,而不是参数,所以可以调用方法链。
⑥ 需要注意的是,在参数绑定的时候可以分为按照参数的位置绑定(按照位置绑定时需要注意其实位置是0)和按照参数的名称绑定(按照名称说明在HQL语句中使用到了具名参数)
⑦ 在绑定参数时还需要注意如果参数类型是一个引用类型,那么我们需要使用setEntity()方法来进行参数的绑定。
3.Hibernate的四个细节
① 分页查询
何为分页,就是我每次查询只查询到在数据库中固定两个条目位置之间的数据,体现在页面上就成为了分页。
我们可以两个方法来设置起始条目的位置--setFirstResult()和包含条目的数量setMaxResults()完成分页。
② 命名查询
有时我们不希望在Java的源代码中进行HQL语句的修改,那么我们在hbm.xml中配置一个class节点的同级节点query来指定HQL语句,并且在应用程序中通过session.getNamedQuery()来通过query节点的name属性来创建一个query对象。
③ 投影查询
有时我们希望从数据库中获取一个对象的部分属性。从HQL语句当中我们可以得知list()方法返回的是一个数组对象的集合,即List<Object[]>,我们希望返回的是当前这个类对象的集合应该怎么做呢?
那么首先需要在类中创建一个包含我们想要的属性的构造器,然后将使用这个构造器new出来的对象放入HQL的select语句的查询内容中即可,这样就可以使用List<对象类型>来接收list()方法返回的值。
④ 报表查询
报表查询的意思就是可以使用何种分组函数和聚集函数。如查询各个部分的最低工资和最高工资。