使用HQL查询时,HQL代码分布在程序代码内,不利于维护,使用命名查询可以解决此问题。
使用命名查询步骤 1).修改相应的映射文件,添加如下代码 <hibernate-mapping> <query name="testNamedQuery"> <![CDATA[ from Emp where empno >:empno ]]> </query> </hibernate-mapping> 2).在程序中调用Session的getNameQuery()方法获取此映射文件HQL语句 示例: public void method() { Session session = HibernateSessionFactory.getSession(); //获取映射文件内的HQL语句 Query query = session.getNamedQuery("testNamedQuery"); //实例化一个Emp对象 Emp emp = new Emp(); emp.setEmpno(50); //将雇员信息作为查询条件组合到HQL语句中 query.setProperties(emp); List<Emp> list = query.list(); for(Emp e : list) { System.out.println(e.getEmpno() + " " + e.getEname()); } HibernateSessionFactory.closeSession(); }当HQL语句满足不了查询需求时,可以使用SQL来查询
示例:
/** * 使用SQL进行查询 */ public void method1() { Session session = HibernateSessionFactory.getSession(); String sql = "select {e.*} from Emp e where e.empno >?"; //addEntity是将别名和实体类联系在一起 SQLQuery query = session.createSQLQuery(sql).addEntity("e", Emp.class); query.setInteger(0, 50); List<Emp> list = query.list(); for(Emp emp : list) { System.out.println(emp.getEmpno() + " " + emp.getEname()); } HibernateSessionFactory.closeSession(); } 命名SQL查询 1).映射文件代码 <hibernate-mapping> <sql-query name="testSqlQuery"> <![CDATA[ select {e.*} from Emp e where e.empno >? ]]> <return alias="e" class="com.bc.demo03.pojo.Emp"/> </sql-query> </hibernate-mapping> 2).程序代码 /** * 命名SQL查询 */ public void method2() { Session session = HibernateSessionFactory.getSession(); //获取查询语句 Query query = session.getNamedQuery("testSqlQuery"); //添加参数 query.setInteger(0, 20); //获取查询结果 List<Emp> list = query.list(); for(Emp emp : list) { System.out.println(emp.getEmpno() + " " + emp.getEname()); } HibernateSessionFactory.closeSession(); }在使用Session来执行save()、update()、delete()操作的时候会通过映射标记<sql-insert><sql-update><sql-delete>来重载Hibernate默认的语句,因此我们可以使用这些标记来让Hibernate加载我们自定义的SQL语句
1).实体类映射文件配置 <hibernate-mapping> <class name="com.bc.demo03.pojo.Emp" table="emp" catalog="hibernate_data" lazy="true"> <id name="empno" type="java.lang.Integer"> <column name="EMPNO" /> <generator class="identity"></generator> </id> <property name="ename" type="java.lang.String"> <column name="ENAME" length="10" /> </property> <!--因为自定义update语句不涉及此字段,必须设置update="false"--> <property name="job" type="java.lang.String" update="false"> <column name="JOB" length="9" /> </property> <!--因为自定义insert语句不涉及此字段,必须设置insert="false"--> <property name="mgr" type="java.lang.Integer" insert="false"> <column name="MGR" /> </property> <!--其余属性配置同理略--> <!--自定义SQL语句--> <sql-insert> <!--insert和update没有涉及的字段要在字段配置上添加insert="false"--> insert into Emp (ename,job) values(?,?) </sql-insert> <sql-update> <!--insert和update没有涉及的字段要在字段配置上添加update="false"--> update Emp set ename = ?,mgr = ? where empno = ? </sql-update> <sql-delete> <!--没有涉及的字段要在字段配置上添加delete="false"--> delete from Emp where empno = ? </sql-delete> </class> </hibernate-mapping> 程序代码 <!--正常调用save() update() delete()就会调用自定义SQL,这里就不写了-->