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

命名查询

使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值