Hibernate的数据查询


第四章第四章第四章第四章 Hibernate Hibernate Hibernate Hibernate 的数据查询的数据查询的数据查询的数据查询 1.1.1.1.数据查询方式简介数据查询方式简介数据查询方式简介数据查询方式简介 Hibernate Hibernate Hibernate Hibernate 提供了多种数据查询方式,分别如下:提供了多种数据查询方式,分别如下:提供了多种数据查询方式,分别如下:提供了多种数据查询方式,分别如下: ���� OIDOIDOIDOID检索方式检索方式检索方式检索方式::::利用利用利用利用Session Session Session Session 的的的的get get get get 和和和和load load load load 方法加载指定 方法加载指定 方法加载指定 方法加载指定 OIOIOIOIDDDD 的对象。的对象。的对象。的对象。 ���� 对象导航检索方式:通过已经加载的对象,导航到其他对象对象导航检索方式:通过已经加载的对象,导航到其他对象对象导航检索方式:通过已经加载的对象,导航到其他对象对象导航检索方式:通过已经加载的对象,导航到其他对象。。。。 ���� HQHQHQHQLLLL 检索方式检索方式检索方式检索方式::::通通通通过过过过 QuerQuerQuerQueryyyy 接口使用面向对象接口使用面向对象接口使用面向对象接口使用面向对象的的的的 HQHQHQHQLLLL 查询语言查询语言查询语言查询语言。。。。 ���� QBCQBCQBCQBC检索方式:使用 检索方式:使用 检索方式:使用 检索方式:使用 QBC(QueryQBC(QueryQBC(QueryQBC(Query ByByByBy Criteria)API Criteria)API Criteria)API Criteria)API 检索对象检索对象检索对象检索对象。。。。 ���� 本地本地本地本地SQLSQLSQLSQL检索方式:检索方式:检索方式:检索方式:Hibernate Hibernate Hibernate Hibernate 完全支持 完全支持 完全支持 完全支持 SQLSQLSQLSQL语句。语句。语句。语句。 1.1)1.1)1.1)1.1) HQLHQLHQLHQL检索方式检索方式检索方式检索方式 首先要明确,首先要明确,首先要明确,首先要明确,SQLSQLSQLSQL操纵的是数据表,而 操纵的是数据表,而 操纵的是数据表,而 操纵的是数据表,而 HQLHQLHQLHQL操纵的是数据表对应操纵的是数据表对应操纵的是数据表对应操纵的是数据表对应 的持久化类。应用示例:的持久化类。应用示例:的持久化类。应用示例:的持久化类。应用示例: this.openSession();this.openSession();this.openSession();this.openSession(); QueryQueryQueryQuery queryqueryqueryquery ==== this.getSession().createQuery("fromthis.getSession().createQuery("fromthis.getSession().createQuery("fromthis.getSession().createQuery("from StaffStaffStaffStaff ssss wherewherewherewhere s.names.names.names.name ==== :name");:name");:name");:name"); query.setString("name"query.setString("name"query.setString("name"query.setString("name" ,,,,"A");"A");"A");"A"); ListListListList listlistlistlist ==== query.list();query.list();query.list();query.list(); ........................ this.closeSession();this.closeSession();this.closeSession();this.closeSession(); 注意注意注意注意::::createQuery()createQuery()createQuery()createQuery()方法的入口参数是 方法的入口参数是 方法的入口参数是 方法的入口参数是 HQLHQLHQLHQL查询语句查询语句查询语句查询语句,,,,HQLHQLHQLHQL查询查询查询查询 语句中的语句中的语句中的语句中的““““::::””””表明后面跟的是命名参数。表明后面跟的是命名参数。表明后面跟的是命名参数。表明后面跟的是命名参数。 1.2)1.2)1.2)1.2) QBCQBCQBCQBC检索方式检索方式检索方式检索方式 QBCQBCQBCQBC检索方式主要通过 检索方式主要通过 检索方式主要通过 检索方式主要通过 Criteria Criteria Criteria Criteria 接口、接口、接口、接口、Criterion Criterion Criterion Criterion 接口接口接口接口和和和和 Expression Expression Expression Expression 类实现,它支持在运行时动态生成查询语句。类实现,它支持在运行时动态生成查询语句。类实现,它支持在运行时动态生成查询语句。类实现,它支持在运行时动态生成查询语句。 Criteria Criteria Criteria Criteria 类似一个容器类似一个容器类似一个容器类似一个容器,,,,通过它的 通过它的 通过它的 通过它的 add()add()add()add()方法可以向其实例中添方法可以向其实例中添方法可以向其实例中添方法可以向其实例中添 加查询条件。用法示例:加查询条件。用法示例:加查询条件。用法示例:加查询条件。用法示例: this.openSession();this.openSession();this.openSession();this.openSession(); CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== this.getSession()this.getSession()this.getSession()this.getSession() .createCriteria(Staff.class);.createCriteria(Staff.class);.createCriteria(Staff.class);.createCriteria(Staff.class); CriteriaCriteriaCriteriaCriteria cccc ==== Expression.eq("name"Expression.eq("name"Expression.eq("name"Expression.eq("name" ,"A");,"A");,"A");,"A"); criteriacriteriacriteriacriteria ==== criteria.add(c);criteria.add(c);criteria.add(c);criteria.add(c); ListListListList listlistlistlist ==== criteria.list();criteria.list();criteria.list();criteria.list(); ........................ this.closeSession();this.closeSession();this.closeSession();this.closeSession(); 1.3)1.3)1.3)1.3) 本地本地本地本地SQLSQLSQLSQL查询查询查询查询 Hibernate Hibernate Hibernate Hibernate 为本地 为本地 为本地 为本地 SQLSQLSQLSQL查询提供了专门的方法,即 查询提供了专门的方法,即 查询提供了专门的方法,即 查询提供了专门的方法,即 Session Session Session Session 的的的的 createSQLQuery(StringcreateSQLQuery(StringcreateSQLQuery(StringcreateSQLQuery(String sql)sql)sql)sql)方法,它的参数为要执行的 方法,它的参数为要执行的 方法,它的参数为要执行的 方法,它的参数为要执行的 SQLSQLSQLSQL语语语语 句,它的返回值为 句,它的返回值为 句,它的返回值为 句,它的返回值为 SQLQuery SQLQuery SQLQuery SQLQuery 类型的实例,还需要通过 类型的实例,还需要通过 类型的实例,还需要通过 类型的实例,还需要通过 SQLQuerSQLQuerSQLQuerSQLQueryyyy 接口的 接口的 接口的 接口的 addEntity(StringaddEntity(StringaddEntity(StringaddEntity(String tableAliastableAliastableAliastableAlias ,,,, ClassClassClassClass _class)_class)_class)_class)方法将方法将方法将方法将 查询结果与对应的持久化类关联查询结果与对应的持久化类关联查询结果与对应的持久化类关联查询结果与对应的持久化类关联。。。。该方法的参数为与查询结果关该方法的参数为与查询结果关该方法的参数为与查询结果关该方法的参数为与查询结果关 联的持久化类,第一个参数为表的别名。以下是示例:联的持久化类,第一个参数为表的别名。以下是示例:联的持久化类,第一个参数为表的别名。以下是示例:联的持久化类,第一个参数为表的别名。以下是示例: publicpublicpublicpublic ListListListList queryWithSQL(StringqueryWithSQL(StringqueryWithSQL(StringqueryWithSQL(String sqlsqlsqlsql ,,,, StringStringStringString tableAlias){tableAlias){tableAlias){tableAlias){ SQLQuerySQLQuerySQLQuerySQLQuery queryqueryqueryquery ==== session.createSQLQuery(sql);session.createSQLQuery(sql);session.createSQLQuery(sql);session.createSQLQuery(sql); query.addEntity(tableAliasquery.addEntity(tableAliasquery.addEntity(tableAliasquery.addEntity(tableAlias ,,,, Staff.class);Staff.class);Staff.class);Staff.class); ListListListList listlistlistlist ==== query.list();query.list();query.list();query.list(); returnreturnreturnreturn list;list;list;list; }}}} 可以通过以下方式调用:可以通过以下方式调用:可以通过以下方式调用:可以通过以下方式调用: ListListListList listlistlistlist ==== h.queryWithSQL("selecth.queryWithSQL("selecth.queryWithSQL("selecth.queryWithSQL("select {s.*}{s.*}{s.*}{s.*} fromfromfromfrom tb_stafftb_stafftb_stafftb_staff ssss wherewherewherewhere s.sexs.sexs.sexs.sex ==== '"+'"+'"+'"+ sexsexsexsex +"'+"'+"'+"' ","","",""," ssss ");");");"); Hibernate Hibernate Hibernate Hibernate 还支持在持久化类的映射文件中定义 还支持在持久化类的映射文件中定义 还支持在持久化类的映射文件中定义 还支持在持久化类的映射文件中定义 SQLSQLSQLSQL命名查询语命名查询语命名查询语命名查询语 句,本例在 句,本例在 句,本例在 句,本例在 NamedQuery.hbm.xml NamedQuery.hbm.xml NamedQuery.hbm.xml NamedQuery.hbm.xml 文件中定义 文件中定义 文件中定义 文件中定义 SQLSQLSQLSQL命名查询语句命名查询语句命名查询语句命名查询语句 的代码如下:的代码如下:的代码如下:的代码如下: -->-->--> name="queryStaffBySex">name="queryStaffBySex">name="queryStaffBySex"> -->-->--> :sex]]>:sex]]>:sex]]> -->-->--> />/>/> 在类中就可以像以下这样调用:在类中就可以像以下这样调用:在类中就可以像以下这样调用:在类中就可以像以下这样调用: publicpublicpublicpublic ListListListList queryBySqlNamed(StringqueryBySqlNamed(StringqueryBySqlNamed(StringqueryBySqlNamed(String sex){sex){sex){sex){ QueryQueryQueryQuery queryqueryqueryquery ==== session.getNamedQuerysession.getNamedQuerysession.getNamedQuerysession.getNamedQuery ("queryStaffBySex");("queryStaffBySex");("queryStaffBySex");("queryStaffBySex"); query.setString("sex"query.setString("sex"query.setString("sex"query.setString("sex" ,,,, sex);sex);sex);sex); returnreturnreturnreturn query.list();query.list();query.list();query.list(); }}}} 2.2.2.2. 检索基础检索基础检索基础检索基础 2.1)Query 2.1)Query 2.1)Query 2.1)Query 的的的的list list list list 方法方法方法方法 当执行 当执行 当执行 当执行 list list list list 方法时,返回值有两种情况:方法时,返回值有两种情况:方法时,返回值有两种情况:方法时,返回值有两种情况: ((((1111)查询结果集是 )查询结果集是 )查询结果集是 )查询结果集是 Object Object Object Object 对象集合对象集合对象集合对象集合 这是在检索所有属性时返回的结果,示例如下:这是在检索所有属性时返回的结果,示例如下:这是在检索所有属性时返回的结果,示例如下:这是在检索所有属性时返回的结果,示例如下: this.openSession();this.openSession();this.openSession();this.openSession(); QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from Staff");Staff");Staff");Staff"); ListListListList listlistlistlist ==== query.list();query.list();query.list();query.list(); for(intfor(intfor(intfor(int iiii ==== 0000 ;;;; iiii <<<< list.size()list.size()list.size()list.size() ;;;; i++){i++){i++){i++){ StaffStaffStaffStaff staffstaffstaffstaff ==== (Staff)list.get(i);(Staff)list.get(i);(Staff)list.get(i);(Staff)list.get(i); System.out.println("name:"System.out.println("name:"System.out.println("name:"System.out.println("name:" ++++ staff.getName());staff.getName());staff.getName());staff.getName()); System.out.println("address:"System.out.println("address:"System.out.println("address:"System.out.println("address:" ++++ staff.getAddress());staff.getAddress());staff.getAddress());staff.getAddress()); }}}} this.closeSession();this.closeSession();this.closeSession();this.closeSession(); ((((2222)查询结果集是 )查询结果集是 )查询结果集是 )查询结果集是 Object Object Object Object 类型数组集合。类型数组集合。类型数组集合。类型数组集合。 如果只需检索出一个数据表的部分属性如果只需检索出一个数据表的部分属性如果只需检索出一个数据表的部分属性如果只需检索出一个数据表的部分属性,,,,将返回这个结果将返回这个结果将返回这个结果将返回这个结果,,,, 示例如下:示例如下:示例如下:示例如下: this.openSession();this.openSession();this.openSession();this.openSession(); QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("selectsession.createQuery("selectsession.createQuery("selectsession.createQuery("select namenamenamename ,,,, sexsexsexsex fromfromfromfrom Staff");Staff");Staff");Staff"); ListListListList resultresultresultresult ==== query.list();query.list();query.list();query.list(); for(intfor(intfor(intfor(int iiii ==== 0000 ;;;; iiii <<<< result.size()result.size()result.size()result.size() ;;;; i++){i++){i++){i++){ Object[]Object[]Object[]Object[] objobjobjobj ==== (Object)result.get(i);(Object)result.get(i);(Object)result.get(i);(Object)result.get(i); System.out.println("Name:"System.out.println("Name:"System.out.println("Name:"System.out.println("Name:" ++++ obj[0]);obj[0]);obj[0]);obj[0]); System.out.println("Sex:"System.out.println("Sex:"System.out.println("Sex:"System.out.println("Sex:" ++++ obj[1]);obj[1]);obj[1]);obj[1]); }}}} this.closeSession();this.closeSession();this.closeSession();this.closeSession(); 2.2)Query 2.2)Query 2.2)Query 2.2)Query 的的的的iterator iterator iterator iterator 方法方法方法方法 该方法和 该方法和 该方法和 该方法和 list list list list 方法的功能是相同的,只是执行过程不同,方法的功能是相同的,只是执行过程不同,方法的功能是相同的,只是执行过程不同,方法的功能是相同的,只是执行过程不同,lislislislistttt 方法的执行过程是:方法的执行过程是:方法的执行过程是:方法的执行过程是: ((((1111)))) 执行执行执行执行select select select select 语句从数据库检索所有符合条件的对象;语句从数据库检索所有符合条件的对象;语句从数据库检索所有符合条件的对象;语句从数据库检索所有符合条件的对象; ((((2222)))) 根据所有已检索出对象的 根据所有已检索出对象的 根据所有已检索出对象的 根据所有已检索出对象的 OIDOIDOIDOID检索缓存,如果缓存中已经检索缓存,如果缓存中已经检索缓存,如果缓存中已经检索缓存,如果缓存中已经 存在该对象,则返回在缓存中该对象的引用;存在该对象,则返回在缓存中该对象的引用;存在该对象,则返回在缓存中该对象的引用;存在该对象,则返回在缓存中该对象的引用; ((((3333)))) 从数据库加载其他所有符合条件的记录。从数据库加载其他所有符合条件的记录。从数据库加载其他所有符合条件的记录。从数据库加载其他所有符合条件的记录。 而而而而iterator iterator iterator iterator 方法的执行过程是:方法的执行过程是:方法的执行过程是:方法的执行过程是: ((((1111)))) 执行执行执行执行select select select select 语句从数据库检索所有符合条件对象的 语句从数据库检索所有符合条件对象的 语句从数据库检索所有符合条件对象的 语句从数据库检索所有符合条件对象的 OIDOIDOIDOID;;;; ((((2222)))) 根据所有已检索出对象的 根据所有已检索出对象的 根据所有已检索出对象的 根据所有已检索出对象的 OIDOIDOIDOID检索缓存,如果缓存中已经检索缓存,如果缓存中已经检索缓存,如果缓存中已经检索缓存,如果缓存中已经 存在该对象,则返回在缓存中该对象的引用。存在该对象,则返回在缓存中该对象的引用。存在该对象,则返回在缓存中该对象的引用。存在该对象,则返回在缓存中该对象的引用。 ((((3333)))) 执行执行执行执行select select select select 语句从数据库加载其他所有符合条件的记录语句从数据库加载其他所有符合条件的记录语句从数据库加载其他所有符合条件的记录语句从数据库加载其他所有符合条件的记录。。。。 由上分析可知:当要加载对象的大部分已经存在于缓存中时由上分析可知:当要加载对象的大部分已经存在于缓存中时由上分析可知:当要加载对象的大部分已经存在于缓存中时由上分析可知:当要加载对象的大部分已经存在于缓存中时,,,,执执执执 行行行行iterator iterator iterator iterator 方法是最佳选择,相反,则应该选择 方法是最佳选择,相反,则应该选择 方法是最佳选择,相反,则应该选择 方法是最佳选择,相反,则应该选择 list list list list 方法。方法。方法。方法。 2.32.32.32.3)利用 )利用 )利用 )利用 HQLHQLHQLHQL绑定参数查询绑定参数查询绑定参数查询绑定参数查询 HibernatHibernatHibernatHibernateeee 的参数绑定机制依赖的参数绑定机制依赖的参数绑定机制依赖的参数绑定机制依赖于于于于 JDBCJDBCJDBCJDBCAPAPAPAPIIII 中中中中 PrepareStatemenPrepareStatemenPrepareStatemenPrepareStatementttt 的预定义 的预定义 的预定义 的预定义 SQLSQLSQLSQL语句功能,它的优点如下:语句功能,它的优点如下:语句功能,它的优点如下:语句功能,它的优点如下: ���� 提高了安全性。可以防止恶意调用数据库中的存储过程。提高了安全性。可以防止恶意调用数据库中的存储过程。提高了安全性。可以防止恶意调用数据库中的存储过程。提高了安全性。可以防止恶意调用数据库中的存储过程。 ���� 提高了查询性能。通过底层数据库的预编译 提高了查询性能。通过底层数据库的预编译 提高了查询性能。通过底层数据库的预编译 提高了查询性能。通过底层数据库的预编译 SQLSQLSQLSQL语句功能语句功能语句功能语句功能,,,,只只只只 需要编译一次 需要编译一次 需要编译一次 需要编译一次 SQLSQLSQLSQL语句语句语句语句,,,,然后把它保存在缓存中然后把它保存在缓存中然后把它保存在缓存中然后把它保存在缓存中,,,,如果多次执如果多次执如果多次执如果多次执 行相同形式的 行相同形式的 行相同形式的 行相同形式的 SQLSQLSQLSQL语句语句语句语句,,,,只需从缓存获得可执行代码只需从缓存获得可执行代码只需从缓存获得可执行代码只需从缓存获得可执行代码,,,,无需重无需重无需重无需重 新编译。新编译。新编译。新编译。 2.3.1)2.3.1)2.3.1)2.3.1)绑定参数的方式绑定参数的方式绑定参数的方式绑定参数的方式 ((((1111)按照参数位置绑定)按照参数位置绑定)按照参数位置绑定)按照参数位置绑定 在在在在HQLHQLHQLHQL查询语句中用查询语句中用查询语句中用查询语句中用““““????””””来代替参数,然后调用 来代替参数,然后调用 来代替参数,然后调用 来代替参数,然后调用 setXXsetXXsetXXsetXXXXXX 方法来绑定参数值。示例如下:方法来绑定参数值。示例如下:方法来绑定参数值。示例如下:方法来绑定参数值。示例如下: QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere SEXSEXSEXSEX ==== ???? andandandand AGEAGEAGEAGE >=>=>=>= ?");?");?");?"); query.setString(0query.setString(0query.setString(0query.setString(0 ,,,,"girl");"girl");"girl");"girl"); query.setInteger(1query.setInteger(1query.setInteger(1query.setInteger(1 ,,,, 20);20);20);20); ((((2222)按照参数名绑定)按照参数名绑定)按照参数名绑定)按照参数名绑定 在在在在HQLHQLHQLHQL语句或者指定参数的名称,需要在参数的名称前加语句或者指定参数的名称,需要在参数的名称前加语句或者指定参数的名称,需要在参数的名称前加语句或者指定参数的名称,需要在参数的名称前加 ““““::::””””,,,,然后调用 然后调用 然后调用 然后调用 setXXX setXXX setXXX setXXX 方法来帮顶参数值。示例如下:方法来帮顶参数值。示例如下:方法来帮顶参数值。示例如下:方法来帮顶参数值。示例如下: QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere SEXSEXSEXSEX ==== :sex:sex:sex:sex andandandand AGEAGEAGEAGE >=>=>=>= :age");:age");:age");:age"); query.setString("sex"query.setString("sex"query.setString("sex"query.setString("sex" ,,,,"girl");"girl");"girl");"girl"); query.setInteger("age"query.setInteger("age"query.setInteger("age"query.setInteger("age" ,,,, 20);20);20);20); 和按照参数位置绑定方式相比,它更具有优越性。和按照参数位置绑定方式相比,它更具有优越性。和按照参数位置绑定方式相比,它更具有优越性。和按照参数位置绑定方式相比,它更具有优越性。 2.3.2)Query 2.3.2)Query 2.3.2)Query 2.3.2)Query 接口中位各种类型参数提供绑定值的方法接口中位各种类型参数提供绑定值的方法接口中位各种类型参数提供绑定值的方法接口中位各种类型参数提供绑定值的方法 这些方法如:这些方法如:这些方法如:这些方法如:setString()setString()setString()setString()等;它们都有两种重载方式:等;它们都有两种重载方式:等;它们都有两种重载方式:等;它们都有两种重载方式: ���� setXXX(intsetXXX(intsetXXX(intsetXXX(int positionpositionpositionposition ,,,,[type][type][type][type] value);value);value);value); ���� setXXX(StringsetXXX(StringsetXXX(StringsetXXX(String parameterNameparameterNameparameterNameparameterName ,,,,[type][type][type][type] value);value);value);value); 2.3.3)Query 2.3.3)Query 2.3.3)Query 2.3.3)Query 接口中提供的特殊的绑定参数的方法接口中提供的特殊的绑定参数的方法接口中提供的特殊的绑定参数的方法接口中提供的特殊的绑定参数的方法 ((((1111))))setEntity setEntity setEntity setEntity 方法:方法:方法:方法: 绑定相关持久化类实例为参数,示例如下:绑定相关持久化类实例为参数,示例如下:绑定相关持久化类实例为参数,示例如下:绑定相关持久化类实例为参数,示例如下: DeptDeptDeptDept dddd ==== newnewnewnew Dept();Dept();Dept();Dept(); d.setId(3);d.setId(3);d.setId(3);d.setId(3); QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere dept_iddept_iddept_iddept_id ==== :dept");:dept");:dept");:dept"); query.setEntity("dept"query.setEntity("dept"query.setEntity("dept"query.setEntity("dept" ,,,, d);d);d);d); 注意注意注意注意::::通过给方法绑定的持久化对象可是处于任何状态的通过给方法绑定的持久化对象可是处于任何状态的通过给方法绑定的持久化对象可是处于任何状态的通过给方法绑定的持久化对象可是处于任何状态的。。。。 ((((2222))))setParameter setParameter setParameter setParameter 方法:方法:方法:方法: 绑定任意类型的参数,示例如下:绑定任意类型的参数,示例如下:绑定任意类型的参数,示例如下:绑定任意类型的参数,示例如下: QueryQueryQueryQuery qqqq ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere sexsexsexsex ==== :sex:sex:sex:sex andandandand ageageageage >=>=>=>= :age:age:age:age andandandand addressaddressaddressaddress likelikelikelike :address");:address");:address");:address"); q.setParameter("sex"q.setParameter("sex"q.setParameter("sex"q.setParameter("sex" ,,,,"girl""girl""girl""girl" ,,,, Hibernate.STRING);Hibernate.STRING);Hibernate.STRING);Hibernate.STRING); q.setParameter("age"q.setParameter("age"q.setParameter("age"q.setParameter("age" ,,,, 20202020 ,,,, Hibernate.Integer);Hibernate.Integer);Hibernate.Integer);Hibernate.Integer); q.setParameter("address"q.setParameter("address"q.setParameter("address"q.setParameter("address" ,,,,"%a%b");"%a%b");"%a%b");"%a%b"); 该方法的第三个参数是指定 该方法的第三个参数是指定 该方法的第三个参数是指定 该方法的第三个参数是指定 Hibernate Hibernate Hibernate Hibernate 的映射类型,通常的映射类型,通常的映射类型,通常的映射类型,通常 情况下可以省略,情况下可以省略,情况下可以省略,情况下可以省略,Hibernate Hibernate Hibernate Hibernate 会根据 会根据 会根据 会根据 Java Java Java Java 类型推断出对于类型推断出对于类型推断出对于类型推断出对于 的的的的Hibernate Hibernate Hibernate Hibernate 映射类型。不过日期类型不能省略,因映射类型。不过日期类型不能省略,因映射类型。不过日期类型不能省略,因映射类型。不过日期类型不能省略,因为为为为 java.util.Date java.util.Date java.util.Date java.util.Date 内心对应多种 内心对应多种 内心对应多种 内心对应多种 Hibernate Hibernate Hibernate Hibernate 映射类型映射类型映射类型映射类型 ((((Hibernate.DATEHibernate.DATEHibernate.DATEHibernate.DATE ,,,, Hibernate.TIMEHibernate.TIMEHibernate.TIMEHibernate.TIME ,,,, Hibernate.TIMESTAMPHibernate.TIMESTAMPHibernate.TIMESTAMPHibernate.TIMESTAMP ,,,, Hibernate.TIMEONEHibernate.TIMEONEHibernate.TIMEONEHibernate.TIMEONE)))).... ((((3333))))setProperties setProperties setProperties setProperties 方法:方法:方法:方法: 绑定一个拥有与所有参数同名的属性对象。示例如下:绑定一个拥有与所有参数同名的属性对象。示例如下:绑定一个拥有与所有参数同名的属性对象。示例如下:绑定一个拥有与所有参数同名的属性对象。示例如下: TestTestTestTest tttt ==== newnewnewnew Test();Test();Test();Test(); t.setSex("girl");t.setSex("girl");t.setSex("girl");t.setSex("girl"); t.setAge(20);t.setAge(20);t.setAge(20);t.setAge(20); QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere sexsexsexsex ==== :sex:sex:sex:sex andandandand ageageageage >=>=>=>= :age");:age");:age");:age"); query.setProperties(t);query.setProperties(t);query.setProperties(t);query.setProperties(t); 此方法要求欲绑定类至少包含所有与命名参数同名的属此方法要求欲绑定类至少包含所有与命名参数同名的属此方法要求欲绑定类至少包含所有与命名参数同名的属此方法要求欲绑定类至少包含所有与命名参数同名的属 性性性性,,,,并且区分大小写并且区分大小写并且区分大小写并且区分大小写,,,,还要求一定要为与命名参数同名的属还要求一定要为与命名参数同名的属还要求一定要为与命名参数同名的属还要求一定要为与命名参数同名的属 性赋值,该方法在执行过程中调用了 性赋值,该方法在执行过程中调用了 性赋值,该方法在执行过程中调用了 性赋值,该方法在执行过程中调用了 setParameter setParameter setParameter setParameter 方法,方法,方法,方法, 所以日期类型的命名参数不能通过此方法绑定。所以日期类型的命名参数不能通过此方法绑定。所以日期类型的命名参数不能通过此方法绑定。所以日期类型的命名参数不能通过此方法绑定。 2.4)2.4)2.4)2.4)只返回一个检索对象只返回一个检索对象只返回一个检索对象只返回一个检索对象 在检索过程中在检索过程中在检索过程中在检索过程中,,,,如果只需要返回一个满足条件的对象如果只需要返回一个满足条件的对象如果只需要返回一个满足条件的对象如果只需要返回一个满足条件的对象,,,,可以先通可以先通可以先通可以先通 过调用 过调用 过调用 过调用 Query Query Query Query 接口或 接口或 接口或 接口或 Criteria Criteria Criteria Criteria 接口的 接口的 接口的 接口的 setMaxResults setMaxResults setMaxResults setMaxResults 方法将返方法将返方法将返方法将返 回对象的数量设定为 回对象的数量设定为 回对象的数量设定为 回对象的数量设定为 1111,,,,然后再调用 然后再调用 然后再调用 然后再调用 uniqueResult uniqueResult uniqueResult uniqueResult 方法方法方法方法,,,,该方法该方法该方法该方法 的返回值是一个 的返回值是一个 的返回值是一个 的返回值是一个 Object Object Object Object 类型的对象。示例如下:类型的对象。示例如下:类型的对象。示例如下:类型的对象。示例如下: -->-->--> ObjectObjectObjectObject objectobjectobjectobject ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from Staff")Staff")Staff")Staff") .setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult(); -->-->--> ObjectObjectObjectObject objectobjectobjectobject ==== session.createCriteria(Staff.class)session.createCriteria(Staff.class)session.createCriteria(Staff.class)session.createCriteria(Staff.class) .setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult();.setMaxResults(1).uniqueResult(); 如果确定返回对象只有一个,也可以用以下方法来实现:如果确定返回对象只有一个,也可以用以下方法来实现:如果确定返回对象只有一个,也可以用以下方法来实现:如果确定返回对象只有一个,也可以用以下方法来实现: -->-->--> ObjectObjectObjectObject objectobjectobjectobject ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere idididid ==== 6").setMaxResults(1);6").setMaxResults(1);6").setMaxResults(1);6").setMaxResults(1); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); CriterionCriterionCriterionCriterion idididid ==== Expression.eq("id"Expression.eq("id"Expression.eq("id"Expression.eq("id" ,,,, 6);6);6);6); criteria.add(id);criteria.add(id);criteria.add(id);criteria.add(id); ObjectObjectObjectObject objectobjectobjectobject ==== criteria.uniqueResult();criteria.uniqueResult();criteria.uniqueResult();criteria.uniqueResult(); 注意注意注意注意::::如果有多个满足条件的对象如果有多个满足条件的对象如果有多个满足条件的对象如果有多个满足条件的对象,,,,而且没有调用 而且没有调用 而且没有调用 而且没有调用 setMaxResultsetMaxResultsetMaxResultsetMaxResultssss 将返回对象数设置为 将返回对象数设置为 将返回对象数设置为 将返回对象数设置为 1111,那么程序将抛出异常。,那么程序将抛出异常。,那么程序将抛出异常。,那么程序将抛出异常。 2.5)2.5)2.5)2.5)多态查询多态查询多态查询多态查询 多态查询是指在检索当前类时,多态查询是指在检索当前类时,多态查询是指在检索当前类时,多态查询是指在检索当前类时,Hibernate Hibernate Hibernate Hibernate 会同时检索当前类的会同时检索当前类的会同时检索当前类的会同时检索当前类的 子类,检索结果是当前类及其子类的所有实例,假如 子类,检索结果是当前类及其子类的所有实例,假如 子类,检索结果是当前类及其子类的所有实例,假如 子类,检索结果是当前类及其子类的所有实例,假如 InvestoInvestoInvestoInvestorrrr 类为父类类为父类类为父类类为父类,,,,Staff Staff Staff Staff 是其子类是其子类是其子类是其子类,,,,它们映射的同为表 它们映射的同为表 它们映射的同为表 它们映射的同为表 tb_stafftb_stafftb_stafftb_staff,,,,示例示例示例示例 如下:如下:如下:如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from Investor");Investor");Investor");Investor"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Investor.class);session.createCriteria(Investor.class);session.createCriteria(Investor.class);session.createCriteria(Investor.class); 注意注意注意注意::::也可以对接口进行多态查询也可以对接口进行多态查询也可以对接口进行多态查询也可以对接口进行多态查询,,,,将检索出实现当前接口的所将检索出实现当前接口的所将检索出实现当前接口的所将检索出实现当前接口的所 有类的实例。有类的实例。有类的实例。有类的实例。 2.6)2.6)2.6)2.6)分批检索对象分批检索对象分批检索对象分批检索对象 Hibernate Hibernate Hibernate Hibernate 提供了分批检索的功能,提供了分批检索的功能,提供了分批检索的功能,提供了分批检索的功能,HQLHQLHQLHQL和和和和QBCQBCQBCQBC都提供了这个检都提供了这个检都提供了这个检都提供了这个检 索方式,示例如下:索方式,示例如下:索方式,示例如下:索方式,示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from Staff");Staff");Staff");Staff"); query.setFirstResult(3);query.setFirstResult(3);query.setFirstResult(3);query.setFirstResult(3); query.setMaxResults(6);query.setMaxResults(6);query.setMaxResults(6);query.setMaxResults(6); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); criteria.setFirstResult(3);criteria.setFirstResult(3);criteria.setFirstResult(3);criteria.setFirstResult(3); criteria.setMaxResults(6);criteria.setMaxResults(6);criteria.setMaxResults(6);criteria.setMaxResults(6); 2.7)2.7)2.7)2.7)在映射文件中定义命名查询语句在映射文件中定义命名查询语句在映射文件中定义命名查询语句在映射文件中定义命名查询语句 Hibernate Hibernate Hibernate Hibernate 支持将查询语句写在持久化类的映射文件中,示例如支持将查询语句写在持久化类的映射文件中,示例如支持将查询语句写在持久化类的映射文件中,示例如支持将查询语句写在持久化类的映射文件中,示例如 下:下:下:下: name="QueryAllDept">name="QueryAllDept">name="QueryAllDept"> Dept]]>Dept]]>Dept]]> name="QueryStaffByDeptId">name="QueryStaffByDeptId">name="QueryStaffByDeptId"> :DeptId]]>:DeptId]]>:DeptId]]> 注意注意注意注意,,,,元素是元素是元素是元素是元素的子元素元素的子元素元素的子元素元素的子元素,,,,而且而且而且而且 在配置文件中应位于在配置文件中应位于在配置文件中应位于在配置文件中应位于元素之后,在这个示例中,由于没元素之后,在这个示例中,由于没元素之后,在这个示例中,由于没元素之后,在这个示例中,由于没 有有有有元素,因此可以这样。元素,因此可以这样。元素,因此可以这样。元素,因此可以这样。 在程序中通过 在程序中通过 在程序中通过 在程序中通过 Session Session Session Session 的的的的getNamedQuery getNamedQuery getNamedQuery getNamedQuery 方法调用命名查询语方法调用命名查询语方法调用命名查询语方法调用命名查询语 句,示例如下:句,示例如下:句,示例如下:句,示例如下: publicpublicpublicpublic ListListListList queryAllDept(){queryAllDept(){queryAllDept(){queryAllDept(){ QueryQueryQueryQuery queryqueryqueryquery ==== session.getNamedQuery("QueryAllDept");session.getNamedQuery("QueryAllDept");session.getNamedQuery("QueryAllDept");session.getNamedQuery("QueryAllDept"); returnreturnreturnreturn query.list();query.list();query.list();query.list(); }}}} publicpublicpublicpublic ListListListList queryStaffByDeptId(){queryStaffByDeptId(){queryStaffByDeptId(){queryStaffByDeptId(){ QueryQueryQueryQuery queryqueryqueryquery ==== session.getNamedQuerysession.getNamedQuerysession.getNamedQuerysession.getNamedQuery ("QueryStaffByDeptId");("QueryStaffByDeptId");("QueryStaffByDeptId");("QueryStaffByDeptId"); query.setInteger("DeptId"query.setInteger("DeptId"query.setInteger("DeptId"query.setInteger("DeptId" ,,,, deptId);deptId);deptId);deptId); returnreturnreturnreturn query.list();query.list();query.list();query.list(); }}}} 注意:命名查询语句可以是 注意:命名查询语句可以是 注意:命名查询语句可以是 注意:命名查询语句可以是 HQLHQLHQLHQL语句,也可以是 语句,也可以是 语句,也可以是 语句,也可以是 SQLSQLSQLSQL语句。语句。语句。语句。 3.3.3.3. 条件查询条件查询条件查询条件查询 Hibernate Hibernate Hibernate Hibernate 条件查询分类条件查询分类条件查询分类条件查询分类 查询种类查询种类查询种类查询种类 HQLHQLHQLHQL检索方式检索方式检索方式检索方式 QBCQBCQBCQBC检索方式检索方式检索方式检索方式 比较比较比较比较 ==== Expression.eq()Expression.eq()Expression.eq()Expression.eq() <>(<>(<>(<>(或或或或!=)!=)!=)!=) Expression.not(Expression.eq())Expression.not(Expression.eq())Expression.not(Expression.eq())Expression.not(Expression.eq()) >>>> Expression.gt()Expression.gt()Expression.gt()Expression.gt() >=>=>=>= Expression.ge()Expression.ge()Expression.ge()Expression.ge() <<<< Expression.lt()Expression.lt()Expression.lt()Expression.lt() <=<=<=<= Expression.le()Expression.le()Expression.le()Expression.le() iiiissss nullnullnullnull Expression.isNull()Expression.isNull()Expression.isNull()Expression.isNull() isisisis notnotnotnot nullnullnullnull Expression.isNotNull()Expression.isNotNull()Expression.isNotNull()Expression.isNotNull() 限定范围限定范围限定范围限定范围 inininin Expression.in()Expression.in()Expression.in()Expression.in() notnotnotnot inininin Expression.not(Expression.in())Expression.not(Expression.in())Expression.not(Expression.in())Expression.not(Expression.in()) betweenbetweenbetweenbetween AAAA andandandand BBBB Expression.between()Expression.between()Expression.between()Expression.between() notnotnotnot BetweenBetweenBetweenBetween AAAA andandandand BBBB Expression.not(ExpressionExpression.not(ExpressionExpression.not(ExpressionExpression.not(Expression .between()).between()).between()).between()) 逻辑关系逻辑关系逻辑关系逻辑关系 andandandand Expression.and()Expression.and()Expression.and()Expression.and() orororor Expression.or()Expression.or()Expression.or()Expression.or() notnotnotnot Expression.not()Expression.not()Expression.not()Expression.not() 字符串匹字符串匹字符串匹字符串匹 配配配配 likelikelikelike Expression.like()Expression.like()Expression.like()Expression.like() 3.1)3.1)3.1)3.1) 比较查询比较查询比较查询比较查询 示例如下:示例如下:示例如下:示例如下: -->-->--> -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere addressaddressaddressaddress isisisis null");null");null");null"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); citeria.add(Expression.isNull("address"));citeria.add(Expression.isNull("address"));citeria.add(Expression.isNull("address"));citeria.add(Expression.isNull("address")); -->-->--> -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere lower(name)lower(name)lower(name)lower(name) ==== 'f'");'f'");'f'");'f'"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); Criteria.add(Expression.eq("name"Criteria.add(Expression.eq("name"Criteria.add(Expression.eq("name"Criteria.add(Expression.eq("name" ,,,,"f")"f")"f")"f") .ignoreCase());.ignoreCase());.ignoreCase());.ignoreCase()); 3.2)3.2)3.2)3.2) 限定查询范围限定查询范围限定查询范围限定查询范围 ((((1111)))) 检索某个字段满足多个条件中其中一条的所有记录,示例如下:检索某个字段满足多个条件中其中一条的所有记录,示例如下:检索某个字段满足多个条件中其中一条的所有记录,示例如下:检索某个字段满足多个条件中其中一条的所有记录,示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from DeptDeptDeptDept wherewherewherewhere namenamenamename in('part1'in('part1'in('part1'in('part1' ,,,,'part2')");'part2')");'part2')");'part2')"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Dept.class);session.createCriteria(Dept.class);session.createCriteria(Dept.class);session.createCriteria(Dept.class); String[]String[]String[]String[] deptsdeptsdeptsdepts ==== {'part1'{'part1'{'part1'{'part1' ,,,,'part2'};'part2'};'part2'};'part2'}; Criteria.add(Expression.in("name"Criteria.add(Expression.in("name"Criteria.add(Expression.in("name"Criteria.add(Expression.in("name" ,,,, depts));depts));depts));depts)); ((((2222)))) 检索某一字段满足指定范围的所有记录,示例如下:检索某一字段满足指定范围的所有记录,示例如下:检索某一字段满足指定范围的所有记录,示例如下:检索某一字段满足指定范围的所有记录,示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere salarysalarysalarysalary notnotnotnot betweenbetweenbetweenbetween 3000300030003000 andandandand 4000");4000");4000");4000"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); Criteria.add(Expression.not(Expression.betweenCriteria.add(Expression.not(Expression.betweenCriteria.add(Expression.not(Expression.betweenCriteria.add(Expression.not(Expression.between ("salary"("salary"("salary"("salary" ,,,, 3000300030003000 ,,,, 4000)));4000)));4000)));4000))); 3.3)3.3)3.3)3.3) 逻辑关系查询逻辑关系查询逻辑关系查询逻辑关系查询 应用示例如下:应用示例如下:应用示例如下:应用示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere sexsexsexsex ==== 'girl''girl''girl''girl' andandandand (schoolage(schoolage(schoolage(schoolage ==== 'shuoshi''shuoshi''shuoshi''shuoshi' orororor nationnationnationnation !=!=!=!= 'han')");'han')");'han')");'han')"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); Criteria.add(Expression.add(Expression.eq("sex"Criteria.add(Expression.add(Expression.eq("sex"Criteria.add(Expression.add(Expression.eq("sex"Criteria.add(Expression.add(Expression.eq("sex" ,,,, girl),girl),girl),girl), Expression.or(Expression.eq("schoolage"Expression.or(Expression.eq("schoolage"Expression.or(Expression.eq("schoolage"Expression.or(Expression.eq("schoolage" ,,,,"shuoshi"),"shuoshi"),"shuoshi"),"shuoshi"), Expression.not(Expression.eq("nation"Expression.not(Expression.eq("nation"Expression.not(Expression.eq("nation"Expression.not(Expression.eq("nation" ,,,,"han")))));"han")))));"han")))));"han"))))); 3.4)3.4)3.4)3.4) 字符串匹配查询字符串匹配查询字符串匹配查询字符串匹配查询 在字符串匹配中,在字符串匹配中,在字符串匹配中,在字符串匹配中,““““____””””表示匹配单个字符,表示匹配单个字符,表示匹配单个字符,表示匹配单个字符,““““%%%%””””表示匹配任意长度的字表示匹配任意长度的字表示匹配任意长度的字表示匹配任意长度的字 符,对于 符,对于 符,对于 符,对于 HQLHQLHQLHQL和和和和QBCQBCQBCQBC都适用。示例如下:都适用。示例如下:都适用。示例如下:都适用。示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff wherewherewherewhere idCardidCardidCardidCard likelikelikelike '%2_7%''%2_7%''%2_7%''%2_7%' ");");");"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); Criteria.add(Expression.like("idCard"Criteria.add(Expression.like("idCard"Criteria.add(Expression.like("idCard"Criteria.add(Expression.like("idCard" ,,,,"%2_7%"));"%2_7%"));"%2_7%"));"%2_7%")); 注意:注意:注意:注意:““““%%%%””””可以用来匹配汉字,而可以用来匹配汉字,而可以用来匹配汉字,而可以用来匹配汉字,而““““____””””不可以。不可以。不可以。不可以。 4.4.4.4. 统计函数的运用统计函数的运用统计函数的运用统计函数的运用 HQLHQLHQLHQL支持统计函数,而 支持统计函数,而 支持统计函数,而 支持统计函数,而 QBCQBCQBCQBC不支持,应用示例如下:不支持,应用示例如下:不支持,应用示例如下:不支持,应用示例如下: LongLongLongLong cccc ==== (Long)session.createQuery((Long)session.createQuery((Long)session.createQuery((Long)session.createQuery( "select"select"select"select COUNT(*)COUNT(*)COUNT(*)COUNT(*) fromfromfromfrom StaffStaffStaffStaff wherewherewherewhere schoolageschoolageschoolageschoolage ==== 'shuoshi'").uniqueResult();'shuoshi'").uniqueResult();'shuoshi'").uniqueResult();'shuoshi'").uniqueResult(); IntegerIntegerIntegerInteger cccc ==== (Integer)session.createQuery((Integer)session.createQuery((Integer)session.createQuery((Integer)session.createQuery( "select"select"select"select MIN(salary)MIN(salary)MIN(salary)MIN(salary) fromfromfromfrom Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult(); IntegerIntegerIntegerInteger cccc ==== (Integer)session.createQuery((Integer)session.createQuery((Integer)session.createQuery((Integer)session.createQuery( "select"select"select"select MAX(salary)MAX(salary)MAX(salary)MAX(salary) fromfromfromfrom Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult(); LongLongLongLong cccc ==== (Long)session.createQuery((Long)session.createQuery((Long)session.createQuery((Long)session.createQuery( "select"select"select"select SUM(salary)SUM(salary)SUM(salary)SUM(salary) fromfromfromfrom Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult(); DoubleDoubleDoubleDouble cccc ==== (Double)session.createQuery((Double)session.createQuery((Double)session.createQuery((Double)session.createQuery( "select"select"select"select AVG(salary)AVG(salary)AVG(salary)AVG(salary) fromfromfromfrom Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult();Staff").uniqueResult(); 5.5.5.5. 投影查询投影查询投影查询投影查询 投影查询即查询表中的某些字段,前面已有示例。在这里需要注意的是,投影查询即查询表中的某些字段,前面已有示例。在这里需要注意的是,投影查询即查询表中的某些字段,前面已有示例。在这里需要注意的是,投影查询即查询表中的某些字段,前面已有示例。在这里需要注意的是, 在执行投影查询时也可以通过实例化检索结果,使程序在访问数据时能够在执行投影查询时也可以通过实例化检索结果,使程序在访问数据时能够在执行投影查询时也可以通过实例化检索结果,使程序在访问数据时能够在执行投影查询时也可以通过实例化检索结果,使程序在访问数据时能够 运用面向对象思想,示例如下:运用面向对象思想,示例如下:运用面向对象思想,示例如下:运用面向对象思想,示例如下: QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery(session.createQuery(session.createQuery(session.createQuery( "select"select"select"select newnewnewnew Staff(s.nameStaff(s.nameStaff(s.nameStaff(s.name ,,,, s.salary)s.salary)s.salary)s.salary) fromfromfromfrom ssss wherewherewherewhere idididid in(6in(6in(6in(6 ,,,, 8)");8)");8)");8)"); 采用上述编码方式需要一个前提条件,就是必须在对应的持久化类中定义采用上述编码方式需要一个前提条件,就是必须在对应的持久化类中定义采用上述编码方式需要一个前提条件,就是必须在对应的持久化类中定义采用上述编码方式需要一个前提条件,就是必须在对应的持久化类中定义 一个对应的构造方法,供实例化检索结果时使用,本例的示例如下:一个对应的构造方法,供实例化检索结果时使用,本例的示例如下:一个对应的构造方法,供实例化检索结果时使用,本例的示例如下:一个对应的构造方法,供实例化检索结果时使用,本例的示例如下: publicpublicpublicpublic Staff(StringStaff(StringStaff(StringStaff(String namenamenamename ,,,, intintintint salary){salary){salary){salary){ this.namethis.namethis.namethis.name ==== name;name;name;name; this.salarythis.salarythis.salarythis.salary ==== salary;salary;salary;salary; }}}} 注意:构造方法的参数的顺序必须与检索属性的顺序一一对应。注意:构造方法的参数的顺序必须与检索属性的顺序一一对应。注意:构造方法的参数的顺序必须与检索属性的顺序一一对应。注意:构造方法的参数的顺序必须与检索属性的顺序一一对应。 这样就可以使用面向对象的思想来处理了,示例如下:这样就可以使用面向对象的思想来处理了,示例如下:这样就可以使用面向对象的思想来处理了,示例如下:这样就可以使用面向对象的思想来处理了,示例如下: for(intfor(intfor(intfor(int iiii ==== 0000 ;;;; iiii <<<< list.size()list.size()list.size()list.size() ;;;; i++){i++){i++){i++){ StaffStaffStaffStaff staffstaffstaffstaff ==== (Staff)list.get(i);(Staff)list.get(i);(Staff)list.get(i);(Staff)list.get(i); System.out.println(staff.getName()System.out.println(staff.getName()System.out.println(staff.getName()System.out.println(staff.getName() ++++ """" salarysalarysalarysalary isisisis """" ++++ staff.getSalary());staff.getSalary());staff.getSalary());staff.getSalary()); }}}} 6.6.6.6. 将查询结果排序将查询结果排序将查询结果排序将查询结果排序 示例如下:示例如下:示例如下:示例如下: -->-->--> QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery("fromsession.createQuery("fromsession.createQuery("fromsession.createQuery("from StaffStaffStaffStaff orderorderorderorder bybybyby namenamenamename ascascascasc ,,,, ageageageage desc");desc");desc");desc"); -->-->--> CriteriaCriteriaCriteriaCriteria criteriacriteriacriteriacriteria ==== session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class);session.createCriteria(Staff.class); citeria.addOrder(Order.asc(name))citeria.addOrder(Order.asc(name))citeria.addOrder(Order.asc(name))citeria.addOrder(Order.asc(name)) .addOrder(Order.desc(age));.addOrder(Order.desc(age));.addOrder(Order.desc(age));.addOrder(Order.desc(age)); 7.7.7.7. 分组查询分组查询分组查询分组查询 HQLHQLHQLHQL支持分组查询,而 支持分组查询,而 支持分组查询,而 支持分组查询,而 QBCQBCQBCQBC不支持分组查询,示例如下:不支持分组查询,示例如下:不支持分组查询,示例如下:不支持分组查询,示例如下: QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery(session.createQuery(session.createQuery(session.createQuery( "select"select"select"select nationnationnationnation fromfromfromfrom SraffSraffSraffSraff groupgroupgroupgroup bybybyby nation");nation");nation");nation"); QueryQueryQueryQuery queryqueryqueryquery ==== session.createQuery(session.createQuery(session.createQuery(session.createQuery( "select"select"select"select nationnationnationnation fromStafffromStafffromStafffromStaff groupgroupgroupgroup bybybyby nationnationnationnation havinghavinghavinghaving nationnationnationnation notnotnotnot likelikelikelike '%han%'");'%han%'");'%han%'");'%han%'"); 8.8.8.8. 联接查询联接查询联接查询联接查询<<<<未完待续!未完待续!未完待续!未完待续!>>>> 9.9.9.9. 高级查询高级查询高级查询高级查询 9.1)9.1)9.1)9.1) 集合过滤集合过滤集合过滤集合过滤 在采用一对多关联的情况下在采用一对多关联的情况下在采用一对多关联的情况下在采用一对多关联的情况下,,,,如果一方采用延迟检索策略如果一方采用延迟检索策略如果一方采用延迟检索策略如果一方采用延迟检索策略,,,,即将即将即将即将元素元素元素元素 的的的的lazy lazy lazy lazy 属性设为 属性设为 属性设为 属性设为 truetruetruetrue。。。。当要操作关联对象的一部分时当要操作关联对象的一部分时当要操作关联对象的一部分时当要操作关联对象的一部分时,,,,需要加载与之关联需要加载与之关联需要加载与之关联需要加载与之关联 的所有对象,假设一个 的所有对象,假设一个 的所有对象,假设一个 的所有对象,假设一个 Dept Dept Dept Dept 类的实例要与很多 类的实例要与很多 类的实例要与很多 类的实例要与很多 Staff Staff Staff Staff 类的实例关联时类的实例关联时类的实例关联时类的实例关联时,,,,将将将将 严重影响软件的运行速度,可以通过 严重影响软件的运行速度,可以通过 严重影响软件的运行速度,可以通过 严重影响软件的运行速度,可以通过 Hibernate Hibernate Hibernate Hibernate 提供的集合过滤功能解决提供的集合过滤功能解决提供的集合过滤功能解决提供的集合过滤功能解决 这个问题,有两种方式,分别是:通过编程接口实现和通过配置映射文件这个问题,有两种方式,分别是:通过编程接口实现和通过配置映射文件这个问题,有两种方式,分别是:通过编程接口实现和通过配置映射文件这个问题,有两种方式,分别是:通过编程接口实现和通过配置映射文件 实现。实现。实现。实现。 ((((1111)通过编程接口实现)通过编程接口实现)通过编程接口实现)通过编程接口实现 Session Session Session Session 接口的 接口的 接口的 接口的 createFilter createFilter createFilter createFilter 方法是 方法是 方法是 方法是 Hibernate Hibernate Hibernate Hibernate 提供的实现集合过滤的方提供的实现集合过滤的方提供的实现集合过滤的方提供的实现集合过滤的方 法,法,法,法,createFilter createFilter createFilter createFilter 方法的定义如下:方法的定义如下:方法的定义如下:方法的定义如下: QueryQueryQueryQuery createFilter(ObjectcreateFilter(ObjectcreateFilter(ObjectcreateFilter(Object objectobjectobjectobject ,,,, StringStringStringString sql);sql);sql);sql); 注意:注意:注意:注意: ���� 它的第一个参数为持久化对象的集合它的第一个参数为持久化对象的集合它的第一个参数为持久化对象的集合它的第一个参数为持久化对象的集合,,,,集合中的持久化对象可以是已经集合中的持久化对象可以是已经集合中的持久化对象可以是已经集合中的持久化对象可以是已经 被初始化的被初始化的被初始化的被初始化的,,,,也可以是未被初始化的也可以是未被初始化的也可以是未被初始化的也可以是未被初始化的,,,,但是该集合所属的持久化类的实但是该集合所属的持久化类的实但是该集合所属的持久化类的实但是该集合所属的持久化类的实 例必须处于持久化状态,否则将抛出异常。例必须处于持久化状态,否则将抛出异常。例必须处于持久化状态,否则将抛出异常。例必须处于持久化状态,否则将抛出异常。 ���� 它的第二个参数为过滤集合的条件,通过合法的 它的第二个参数为过滤集合的条件,通过合法的 它的第二个参数为过滤集合的条件,通过合法的 它的第二个参数为过滤集合的条件,通过合法的 HQLHQLHQLHQL查询语句实现。查询语句实现。查询语句实现。查询语句实现。 示例如下:示例如下:示例如下:示例如下: DeptDeptDeptDept deptdeptdeptdept ==== (Dept)session.createQuery("from(Dept)session.createQuery("from(Dept)session.createQuery("from(Dept)session.createQuery("from DeptDeptDeptDept wherewherewherewhere namenamenamename ==== 'part1'").uniqueResult();'part1'").uniqueResult();'part1'").uniqueResult();'part1'").uniqueResult(); QueryQueryQueryQuery queryqueryqueryquery ==== session.createFilter(dept.getStaffs(),session.createFilter(dept.getStaffs(),session.createFilter(dept.getStaffs(),session.createFilter(dept.getStaffs(), "where"where"where"where this.sexthis.sexthis.sexthis.sex ==== 'boy''boy''boy''boy' orderorderorderorder bybybyby this.agethis.agethis.agethis.age descdescdescdesc """");););); ListListListList listlistlistlist ==== query.list();query.list();query.list();query.list(); 注意:注意:注意:注意: ���� 持久化对象 持久化对象 持久化对象 持久化对象 dept dept dept dept 必须处于持久化状态,必须处于持久化状态,必须处于持久化状态,必须处于持久化状态,HQLHQLHQLHQL中的中的中的中的““““thisthisthisthis””””代表欲过滤代表欲过滤代表欲过滤代表欲过滤 的结果集。的结果集。的结果集。的结果集。 ���� 当执行 当执行 当执行 当执行 Query Query Query Query 的的的的list list list list 方法时,无论持久化对象集合中的持久化对象是方法时,无论持久化对象集合中的持久化对象是方法时,无论持久化对象集合中的持久化对象是方法时,无论持久化对象集合中的持久化对象是 否被初始化,否被初始化,否被初始化,否被初始化,Hibernate Hibernate Hibernate Hibernate 都会执行 都会执行 都会执行 都会执行 select select select select 语句检索数据库,如果已经语句检索数据库,如果已经语句检索数据库,如果已经语句检索数据库,如果已经 被初始化被初始化被初始化被初始化,,,,则只返回该对象在缓存中的引用则只返回该对象在缓存中的引用则只返回该对象在缓存中的引用则只返回该对象在缓存中的引用,,,,否则从数据库加载该对象否则从数据库加载该对象否则从数据库加载该对象否则从数据库加载该对象 到缓存。到缓存。到缓存。到缓存。 ((((2222)通过配置文件实现)通过配置文件实现)通过配置文件实现)通过配置文件实现 示例如下:示例如下:示例如下:示例如下: -->-->--> table="tb_dept">table="tb_dept">table="tb_dept"> type="int">type="int">type="int"> />/>/> />/>/> lazy="true">lazy="true">lazy="true"> />/>/> />/>/> -->-->--> />/>/> -->-->--> name="bySex">name="bySex">name="bySex"> -->-->--> />/>/> -->-->--> DeptDeptDeptDept deptdeptdeptdept ==== (Dept)session.createQuery("from(Dept)session.createQuery("from(Dept)session.createQuery("from(Dept)session.createQuery("from DeptDeptDeptDept wherewherewherewhere namenamenamename ==== 'part1'").uniqueResult();'part1'").uniqueResult();'part1'").uniqueResult();'part1'").uniqueResult(); ////////开启过滤器开启过滤器开启过滤器开启过滤器 FilterFilterFilterFilter filterfilterfilterfilter ==== session.enableFilter("bySex");session.enableFilter("bySex");session.enableFilter("bySex");session.enableFilter("bySex"); ////////设置过滤条件设置过滤条件设置过滤条件设置过滤条件 filter.setParamter("sex"filter.setParamter("sex"filter.setParamter("sex"filter.setParamter("sex" ,,,,"girl");"girl");"girl");"girl"); ////////执行过滤执行过滤执行过滤执行过滤 IteratorIteratorIteratorIterator iteratoriteratoriteratoriterator ==== dept.getStaffs().iterator();dept.getStaffs().iterator();dept.getStaffs().iterator();dept.getStaffs().iterator(); 注意:注意:注意:注意: ���� 通过通过通过通过元素定义过滤器,该元素位于元素定义过滤器,该元素位于元素定义过滤器,该元素位于元素定义过滤器,该元素位于元素之后。元素之后。元素之后。元素之后。 元素的元素的元素的元素的name name name name 属性用来定义过滤器的名称,子元素属性用来定义过滤器的名称,子元素属性用来定义过滤器的名称,子元素属性用来定义过滤器的名称,子元素 用来定义该过滤器依据的属性名称及类型,其中 用来定义该过滤器依据的属性名称及类型,其中 用来定义该过滤器依据的属性名称及类型,其中 用来定义该过滤器依据的属性名称及类型,其中 namnamnamnameeee 属性用来定义名称,属性用来定义名称,属性用来定义名称,属性用来定义名称,type type type type 用来定义类型。用来定义类型。用来定义类型。用来定义类型。 ���� 通过通过通过通过元素指定过滤器名称以及过滤器的匹配条件。元素指定过滤器名称以及过滤器的匹配条件。元素指定过滤器名称以及过滤器的匹配条件。元素指定过滤器名称以及过滤器的匹配条件。 元素位于元素位于元素位于元素位于元素之后。元素之后。元素之后。元素之后。 9.2)9.2)9.2)9.2) QBCQBCQBCQBC动态查询动态查询动态查询动态查询 示例略。示例略。示例略。示例略。 说明:说明:说明:说明:HQLHQLHQLHQL检索方式适合于静态查询,而 检索方式适合于静态查询,而 检索方式适合于静态查询,而 检索方式适合于静态查询,而 QBCQBCQBCQBC更适合动态查询。更适合动态查询。更适合动态查询。更适合动态查询。
还剩15页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

kalen

贡献于2010-10-28

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf