您的位置:首页 > 数据库

Hibernate的原生SQL查询

2014-01-14 23:58 357 查看
1. Person和Address实体同前面几篇博客一样,新加一个PersonAddress实体如下:

public class PersonAddress {

    private String personName;

    private String addressName;

    .............

}

2. Person映射文件如下,Address映射文件不变

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="test">

    <class name="Person" table="person_inf">

        <id name="id" column="id">

            <!-- 定义主键生成器策略 -->

            <generator class="identity"/>

        </id>

        <property name="name" type="string"/>

        <many-to-one name="address" cascade="all" class="Address" column="address_id" lazy="false"/>

    </class>

    

    <!-- 定义一个调用存储过程的命名SQL查询 -->

    <sql-query name="callProcedure" callable="true">

        <!-- 将查询结果转换成Student实体 -->

        <return class="Person">

            <!-- 将查询的数据列转换成实体的属性 -->

            <return-property name="id" column="id"/>

            <return-property name="name" column="name"/>

            <return-property name="address" column="address_id"/>

        </return>

        {call select_all_person()}

    </sql-query>

</hibernate-mapping>

3. 测试类

package test;

import org.hibernate.*;

import org.hibernate.transform.*;

import org.hibernate.type.*;

import java.util.*;

public class NativeSQLTest {

    public static void main(String[] args) {

        NativeSQLTest test = new NativeSQLTest();

        // 标量查询

        test.scalarQuery();

        // 实体查询

        test.entityQuery();

        // 执行返回多个实体的查询

        test.multiEntityQuery();

        // 执行返回普通JavaBean的SQL查询, mySql5.1.7,5.1.13会产生异常,3.1.10正常

        test.beanQuery();

        // 使用关联的原生SQL查询

        test.joinQuery();

        // 调用存储过程

        test.callProcedure();

        HibernateUtil.sessionFactory.close();

    }

    // 执行标量查询

    public void scalarQuery() {

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        String sqlString = "select p.* from person_inf as p";

        List l = session.createSQLQuery(sqlString)

        // 指定查询id和name两个数据列

                .addScalar("id", StandardBasicTypes.INTEGER).addScalar("name",

                        StandardBasicTypes.STRING).list();

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素都是一个数组,数组元素是id、name两列值。

            // 如果select后面只有一个字段,那么返回的List集合元素就不是数组,而是单个的变量值

            Object[] row = (Object[]) it.next();

            System.out.println("1---" + row[0] + "\t" + row[1]);

        }

        tx.commit();

        HibernateUtil.closeSession();

    }

    // 执行实体SQL查询

    public void entityQuery() {

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        String sqlString = "select * from person_inf where id=:personid";

        List l = session.createSQLQuery(sqlString)

        // 指定将查询的记录行转换成Person实体,select后面必须选择所有列

                .addEntity(Person.class)

                // 为SQL字符串的参数设置值

                .setInteger("personid", 1).list();

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素都是一个Person对象

            Person p = (Person) it.next();

            System.out.println("2---" + p.getId() + "\t" + p.getName() + "\t"

                    + p.getAddress().getName());

        }

        tx.commit();

        HibernateUtil.closeSession();

    }

    // 执行返回多个实体的SQL查询

    public void multiEntityQuery() {

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        String sqlString = "select p.*,a.* "

                + "from person_inf p,address_inf a "

                + "where p.address_id = a.id ";

        List l = session.createSQLQuery(sqlString)

                // 指定将查询的记录行转换成Person实体

                .addEntity("p", Person.class).addEntity("a", Address.class)

                .list();

        tx.commit();

        HibernateUtil.closeSession();

        // 因为数据已经全部被选出,故程序可以遍历列表中的数据

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素都是Person、Address组成的数组

            Object[] objs = (Object[]) it.next();

            Person p = (Person) objs[0];

            Address a = (Address) objs[1];

            System.out.println("3---" + p.getName() + "\t" + a.getName());

        }

    }

    // 执行返回普通JavaBean的SQL查询

    public void beanQuery() {

        // 打开Session和事务

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        String sqlString = "select p.name personName, a.name addressName "

                + "from person_inf p,address_inf a "

                + "where p.address_id = a.id ";

        List l = session.createSQLQuery(sqlString)

        // 指定将查询的记录行转换成PersonAddress对象,此对象只要有getter和setter即可

                .setResultTransformer(

                        Transformers.aliasToBean(PersonAddress.class)).list();

        tx.commit();

        HibernateUtil.closeSession();

        // 因为数据已经全部被选出,故程序可以遍历列表中的数据

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素都是StudentCourse对象

            PersonAddress pa = (PersonAddress) it.next();

            System.out.println("4---" + pa.getPersonName() + "\t"

                    + pa.getAddressName());

        }

    }

    // 使用关联的原生SQL查询

    public void joinQuery() {

        // 打开Session和事务

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        String sqlString = "select p.*,a.* "

                + "from person_inf p,address_inf a "

                + "where p.address_id = a.id ";

        List l = session.createSQLQuery(sqlString).addEntity("p", Person.class)

                .addJoin("a", "p.address").list();

        // 提交事务,关闭Session

        tx.commit();

        HibernateUtil.closeSession();

        // 因为数据已经全部被选出,故程序可以遍历列表中的数据

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素都是Student、Enrolment组成的数组

            Object[] objs = (Object[]) it.next();

            Person p = (Person) objs[0];

            Address a = (Address) objs[1];

            System.out.println("5---" + p.getName() + "\t" + a.getName());

        }

    }

    // 调用存储过程,无法分页、不支持关联

    private void callProcedure() {

        Session session = HibernateUtil.currentSession();

        Transaction tx = session.beginTransaction();

        // 调用命名查询,直接返回结果

        /*

         * 存储过程为 :

         * CREATE PROCEDURE select_all_person()

         * select p.* from

         * person_inf p

         */

        List l = session.getNamedQuery("callProcedure").list();

        tx.commit();

        HibernateUtil.closeSession();

        // 遍历结果集

        for (Iterator it = l.iterator(); it.hasNext();) {

            // 每个集合元素是Student对象

            Person p = (Person) it.next();

            System.out.println("6---" + p.getName());

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息