Hibernate 命名查询、本地SQL、自定义SQL

来源:互联网 发布:dota2怎么看数据 编辑:程序博客网 时间:2024/06/03 17:06

命名查询

使用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();    }

本地SQL

当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();    }

自定义SQL

在使用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,这里就不写了-->
0 0
原创粉丝点击