11.Hibernate检索1.1.hibernate检索方式说明Hibernate提供了以下几种检索对象的方式导航对象图检索方式:根据已经加载的对象导航到其他对象OID检索方式:按照对象的OID来检索对象HQL检索方式:使用面向对象的HQL查询语言QBC检索方式:使用QBC(QueryByCriteria)API来检索对象.这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口.本地SQL检索方式:使用本地数据库的SQL查询语句1.2.HQL检索方式HQL(HibernateQueryLanguage)是面向对象的查询语言,它和SQL查询语言有些相似.在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式.它有如下功能:在查询语句中设定各种查询条件支持投影查询,即仅检索出对象的部分属性支持分页查询支持连接查询支持分组查询,允许使用HAVING和GROUPBY关键字提供内置聚集函数,如sum(),min()和max()能够调用用户定义的SQL函数或标准的SQL函数支持子查询支持动态绑定参数HQL检索方式包括以下步骤:通过Session的createQuery()方法创建一个Query对象,它包括一个HQL查询语句.HQL查询语句中可以包含命名参数动态绑定参数调用Query的list()方法执行查询语句.该方法返回java.util.List类型的查询结果,在List集合中存放了符合查询条件的持久化对象.Qurey接口支持方法链编程风格,它的setXxx()方法返回自身实例,而不是void类型HQLvsSQL:2HQL查询语句是面向对象的,Hibernate负责解析HQL查询语句,然后根据对象-关系映射文件中的映射信息,把HQL查询语句翻译成相应的SQL语句.HQL查询语句中的主体是域模型中的类及类的属性SQL查询语句是与关系数据库绑定在一起的.SQL查询语句中的主体是数据库表及表的字段.HQL的语法类似SQL语法。1.2.1.绑定参数Hibernate的参数绑定机制依赖于JDBCAPI中的PreparedStatement的预定义SQL语句功能.HQL的参数绑定由两种形式:•按参数名字绑定:在HQL查询语句中定义命名参数,命名参数以“:”开头.•按参数位置绑定:在HQL查询语句中用“?”来定义参数位置相关方法:•setEntity():把参数与一个持久化类绑定•setParameter():绑定任意类型的参数.该方法的第三个参数显式指定Hibernate映射类型绑定参数的形式,按参数名称绑定绑定参数的形式,按参数位置绑定hql查询:Queryquery=session.createQuery(fromCustomercwhere+c.name=:custnameandc.age=:custage);//第一个参数代表名字,第二个参数代表值query.setString(custname,Tom);query.setInteger(custage,21);Listlist=query.list();Queryquery=session.createQuery(fromCustomercwherec.name=?andc.age=?);query.setString(0,Tom);query.setInteger(1,21);Query.list();31.2.2.使用别名通过HQL检索一个类的实例时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名fromCustomerascwherec.name=:custnameas可省略1.2.3.排序HQL采用ORDERBY关键字对查询结果排序hql查询:Queryquery=session.createQuery(fromCustomercorderbyc.id);QBC查询:Criteriacriteria=session.createCriteria(Customer.class);criteria.addOrder(org.hibernate.criterion.Order.asc(“id));1.2.4.分页查询:setFirstResult(intfirstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0.默认情况下,Query从查询结果中的第一个对象开始检索setMaxResult(intmaxResults):设定一次最多检索出的对象的数目.在默认情况下,Query和Criteria接口检索出查询结果中所有的对象1.2.5.投影查询投影查询:查询结果仅包含实体的部分属性.通过SELECT关键字实现.Query的list()方法返回的集合中包含的是数组类型的元素,每个对象数组代表查询结果的一条记录可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录,使程序代码能完全运用面向对象的语义来访问查询结果集.可以通过DISTINCT关键字来保证查询结果不会返回重复元素4使用构造函数fromCustomercjoinc.ordersowhereo.orderNumberlike‘T%’如果希望查询结果中只包含Customer对象,可使用以下形式:selectcfromCustomercjoinc.ordersowhereo.orderNumberlikeT%’---------------------------------------------------------------------------------Select关键字还能用于选择对象的部分属性session.createQuery(“selectc.id,c.name,o.orderNumberfromCustomercjoinc.ordersowhereo.orderNumberlike‘T%’”)对应的sql语句为:selectc.ID,c.NAME,o.ORDER_NUMBERfromCUSTOMERScinnerjoinORDERSoonc.ID-=o.CUSTOMER_IDwhereo.ORDER_NUMBERlike’T%’------------------------------------------------------------------------------------过滤重复元素createQuery(“selectdistinctc.namefromcustomerc”);//list集合中存放的对象数组,数组中存放的查询的部分属性Queryquery=session.createQuery(selectc.id,c.name,o.orderNumber+fromCustomercjoinc.ordersowhereo.orderNumberlike'%NO1%');Listlist=query.list();Iteratorit=list.iterator();while(it.hasNext()){Object[]pair=(Object[])it.next();Integerid=(Integer)pair[0];Stringname=(String)pair[1];StringorderNumber=(String)pair[2];System.out.print(id++name++orderNumber);System.out.println();}51.2.6.分组与聚集函数报表查询用于对数据分组和统计,与SQL一样,HQL利用GROUPBY关键字对数据分组,用HAVING关键字对分组数据设定约束条件.在HQL查询语句中可以调用以下聚集函数count()min()max()sum()avg()Queryquery=session.createQuery(selectnewcn.itcast.CustomerRow(c.id,c.name,o.orderNumber)+fromCustomercjoinc.ordersowhereo.orderNumberlike'%NO1%');Listlist=query.list();Iteratorit=list.iterator();while(it.hasNext()){CustomerRowcr=(CustomerRow)it.next();System.out.print(cr.getId()++cr.getName()++cr.getOrderNumber());System.out.println();}Listlist=session.createQuery(selectc.name,count(c)fromCustomercgroupbyc.name).list();System.out.println(list.size());61.2.7.在映射文件中定义命名查询语句1.2.8.其他的查询动态查询:session.createCriteria(Customer.class).add(Expression.like(“name”,name.toLowerCase()),MatchMode.ANYWHERE)class......./classqueryname=findCustomersByName![CDATA[fromCustomercwherec.namelike:name]]/query------------------------------------------------------------------query=session.getNamedQuery(“findCustomersByName”);query.setString(“name”,”Tom”);query.list();使用聚集函数Queryquery=session.createQuery(selectcount(*)fromCustomerc);//Integercount=(Integer)query.uniqueResult();//System.out.println(count+count);/***********************************************************///Queryquery=session.createQuery(selectavg(c.age)fromCustomerc);//Floatavg=(Float)query.uniqueResult();//System.out.println(avg+avg);/***********************************************************///Queryquery=session.createQuery(selectmax(c.age),min(c.age)fromCustomerc);//Object[]maxmin=(Object[])query.uniqueResult();//System.out.println(max+(Long)maxmin[0]);//System.out.println(min+(Long)maxmin[1]);/***********************************************************///Queryquery=session.createQuery(selectsum(c.age)fromCustomerc);//Longsum=(Long)query.uniqueResult();//System.out.println(sum+sum);7.add(Expression.eq(“age”,newInteger(11)));集合过滤:hql: