`

Hibernate中使用命名查询(摘自Hibernate reference 3.2.0中文参考手册16.2节)

阅读更多

命名SQL查询

可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们 需要调用addEntity() 方法.

<sql-query name="persons">
    <return alias="person" class="eg.Person"/>
    SELECT person.NAME AS {person.name},
           person.AGE AS {person.age},
           person.SEX AS {person.sex}
    FROM PERSON person
    WHERE person.NAME LIKE :namePattern
</sql-query>
List people = sess.getNamedQuery("persons")
    .setString("namePattern", namePattern)
    .setMaxResults(50)
    .list();

<return-join><load-collection> 元素是用来连接关联以及将查询定义为预先初始化各个集合的。

<sql-query name="personsWith">
    <return alias="person" class="eg.Person"/>
    <return-join alias="address" property="person.mailingAddress"/>
    SELECT person.NAME AS {person.name},
           person.AGE AS {person.age},
           person.SEX AS {person.sex},
           adddress.STREET AS {address.street},
           adddress.CITY AS {address.city},
           adddress.STATE AS {address.state},
           adddress.ZIP AS {address.zip}
    FROM PERSON person
    JOIN ADDRESS adddress
        ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
    WHERE person.NAME LIKE :namePattern
</sql-query>

一个命名查询可能会返回一个标量值.你必须使用<return-scalar> 元素来指定字段的别名和 Hibernate类型

<sql-query name="mySqlQuery">
    <return-scalar column="name" type="string"/>
    <return-scalar column="age" type="long"/>
    SELECT p.NAME AS name,
           p.AGE AS age,
    FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
</sql-query>

你可以把结果集映射的信息放在外部的<resultset> 元素中,这样就可以在多个命名查询间,或者通过setResultSetMapping() API来访问。(此处原文即存疑。原文为:You can externalize the resultset mapping informations in a <resultset> element to either reuse them accross several named queries or through the setResultSetMapping() API.)

<resultset name="personAddress">
    <return alias="person" class="eg.Person"/>
    <return-join alias="address" property="person.mailingAddress"/>
</resultset>

<sql-query name="personsWith" resultset-ref="personAddress">
    SELECT person.NAME AS {person.name},
           person.AGE AS {person.age},
           person.SEX AS {person.sex},
           adddress.STREET AS {address.street},
           adddress.CITY AS {address.city},
           adddress.STATE AS {address.state},
           adddress.ZIP AS {address.zip}
    FROM PERSON person
    JOIN ADDRESS adddress
        ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
    WHERE person.NAME LIKE :namePattern
</sql-query>

另外,你可以在java代码中直接使用hbm文件中的结果集定义信息。

List cats = sess.createSQLQuery(
        "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
    )
    .setResultSetMapping("catAndKitten")
    .list();

使用return-property来明确地指定字段/别名

使用<return-property> 你可以明确的告诉Hibernate使用哪些字段别名,这取代了使用{} -语法 来让Hibernate注入它自己的别名.

<sql-query name="mySqlQuery">
    <return alias="person" class="eg.Person">
      <return-property name="name" column="myName"/>
      <return-property name="age" column="myAge"/>
      <return-property name="sex" column="mySex"/>
    </return>
    SELECT person.NAME AS myName,
           person.AGE AS myAge,
           person.SEX AS mySex,
    FROM PERSON person WHERE person.NAME LIKE :name
</sql-query>
<return-property> 也可用于多个字段,它解决了使用{} -语法不能细粒度控制多个字段的限制
<sql-query name="organizationCurrentEmployments">
            <return alias="emp" class="Employment">            
             <return-property name="salary"> 
               <return-column name="VALUE"/>
               <return-column name="CURRENCY"/>            
             </return-property>
             <return-property name="endDate" column="myEndDate"/>
            </return>
            SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
            STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
            REGIONCODE as {emp.regionCode}, EID AS {emp.id}, VALUE, CURRENCY
            FROM EMPLOYMENT
            WHERE EMPLOYER = :id AND ENDDATE IS NULL
            ORDER BY STARTDATE ASC
</sql-query>

注意在这个例子中,我们使用了<return-property> 结合{} 的注入语法. 允许用户来选择如何引用字段以及属性.

如果你映射一个识别器(discriminator),你必须使用<return-discriminator> 来指定识别器字段

使用存储过程来查询

Hibernate 3引入了对存储过程查询(stored procedure)和函数(function)的支持.以下的说明中,这二者一般都适用。 存储过程/函数必须返回一个结果集,作为Hibernate能够使用的第一个外部参数. 下面是一个Oracle9和更高版本的存储过程例子.

CREATE OR REPLACE FUNCTION selectAllEmployments 
    RETURN SYS_REFCURSOR 
AS 
    st_cursor SYS_REFCURSOR; 
BEGIN 
    OPEN st_cursor FOR 
 SELECT EMPLOYEE, EMPLOYER, 
 STARTDATE, ENDDATE, 
 REGIONCODE, EID, VALUE, CURRENCY 
 FROM EMPLOYMENT; 
      RETURN  st_cursor; 
 END;

在Hibernate里要要使用这个查询,你需要通过命名查询来映射它.

<sql-query name="selectAllEmployees_SP" callable="true">
    <return alias="emp" class="Employment">
        <return-property name="employee" column="EMPLOYEE"/>
        <return-property name="employer" column="EMPLOYER"/>            
        <return-property name="startDate" column="STARTDATE"/>
        <return-property name="endDate" column="ENDDATE"/>            
        <return-property name="regionCode" column="REGIONCODE"/>            
        <return-property name="id" column="EID"/>                        
        <return-property name="salary"> 
            <return-column name="VALUE"/>
            <return-column name="CURRENCY"/>            
        </return-property>
    </return>
    { ? = call selectAllEmployments() }
</sql-query>

注意存储过程当前仅仅返回标量和实体.现在不支持<return-join><load-collection>

使用存储过程的规则和限制

为了在Hibernate中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想要使用他们, 你必须通过session.connection() 来执行他们.这些规则针对于不同的数据库.因为数据库 提供商有各种不同的存储过程语法和语义.

对存储过程进行的查询无法使用setFirstResult()/setMaxResults() 进行分页。

建议采用的调用方式是标准SQL92: { ? = call functionName(<parameters>) } 或者 { ? = call procedureName(<parameters>} .原生调用语法不被支持。

对于Oracle有如下规则:

  • 函数必须返回一个结果集。存储过程的第一个参数必须是OUT ,它返回一个结果集。这是通过Oracle 9或10的SYS_REFCURSOR 类型来完成的。在Oracle中你需要定义一个REF CURSOR 类型,参见Oracle的手册。

对于Sybase或者MS SQL server有如下规则:

  • 存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值, 其他将被丢弃。

  • 如果你能够在存储过程里设定SET NOCOUNT ON ,这可能会效率更高,但这不是必需的。

分享到:
评论

相关推荐

    Hibernate_3.2.0中文手册

    《Hibernate_3.2.0中文手册》是Java开发者的重要参考资料,它详尽地阐述了Hibernate框架在3.2.0版本中的各项功能和用法。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象的编程模型来...

    Hibernate_3.2.0中文参考

    《Hibernate_3.2.0中文参考》是针对Java开发者的重要资源,它详细阐述了Hibernate 3.2.0版本的特性和用法。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象的编程模型来操作数据库,而...

    Hibernate_3.2.0_Reference_zh_CN.rar hibernate中文api

    《Hibernate 3.2.0 参考指南中文版》是Java开发人员深入理解Hibernate ORM框架的重要参考资料。Hibernate是一款开源的对象关系映射(ORM)工具,它为Java开发者提供了便捷的方式来管理数据库操作,使得开发者无需...

    Hibernate 3.2.0中文离线手册

    Hibernate是一个面向Java环境的对象...Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

    hibernate-3.2.0

    hibernate-3.2.0源码和hibernate-3.2.0所有的jar包。

    hibernate 3.2.0 API.CHM,hibernate中文参考手册.CHM,JS5.5完全参考.CHM,Linux C 函数 使用手册.CHM,Linux命令大全(修改版).CHM,MFC类库详解.CHM,MySQL 5.1 中文手册.CHM,MySQL中文手册3.1.CHM,NHibernate文档.CHM,PHP4中文参考手册.CHM,PHP5中文参考手册.CHM,

    hibernate 3.2.0 API.CHM,hibernate中文参考手册.CHM,JS5.5完全参考.CHM,Linux C 函数 使用手册.CHM, Linux命令大全(修改版).CHM,MFC类库详解.CHM,MySQL 5.1 中文手册.CHM,MySQL中文手册3.1.CHM,NHibernate文档.CHM,...

    Hibernate3.2.0_Reference_zh_CN.chm

    Hibernate3.2.0中文手册,学习和使用Hibernate的必备手册。

    Hibernate_3.2.0_Reference_zh_CN

    《Hibernate 3.2.0 参考指南中文版》是Java开发人员的重要参考资料,它详细阐述了Hibernate框架在3.2.0版本中的各种功能和使用方法。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式...

    Hibernate 3.2.0 中文官方文档

    通过深入学习Hibernate 3.2.0 的中文官方文档,开发者可以掌握这个强大ORM框架的使用,提升Java数据库应用开发的水平。文档通常包含详细的示例、解释和API参考,是学习和解决问题的重要参考资料。

    Hibernate_3.2.0_官方参考手手册

    《Hibernate_3.2.0_官方参考手手册》是一份详尽的指南,涵盖了Hibernate 3.2.0版本的各个方面。Hibernate是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以更加专注于业务逻辑...

    Hibernate_3.2.0_Reference中文版

    《Hibernate_3.2.0_Reference中文版》是关于Hibernate框架的重要参考资料,它详细阐述了Hibernate 3.2.0版本的功能、用法以及最佳实践。Hibernate是一个流行的Java持久化框架,它简化了数据库与Java对象之间的交互,...

    Hibernate3.2.0中文帮助文档

    《Hibernate 3.2.0 中文帮助文档》是一份极其宝贵的资源,它详细阐述了Hibernate 3.2.0版本的核心特性和使用方法。Hibernate是Java开发领域中广泛使用的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来...

    hibernate开发指南+中文参考手册(全)

    3. **Hibernate参考文档**:`Hibernate_3.2.0_Reference_zh_CN.chm`和`hibernate_reference3.1.2.pdf`是Hibernate不同版本的中文参考手册,包含了详细的功能介绍、配置说明和使用示例。学习这些文档可以帮助开发者...

    Hibernate_3.2.0帮助手册.chm

    《Hibernate_3.2.0帮助手册》是一个关于Hibernate框架的详细参考资料,主要针对的是Hibernate 3.2.0版本。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作,使得...

    Hibernate_3.2.0_Reference_zh_CN.rar

    《Hibernate 3.2.0 参考指南中文版》是一个详尽的资源,涵盖了Java对象关系映射框架Hibernate的核心概念和技术。这个压缩包包含了针对Hibernate 3.2.0版本的完整参考文档,旨在帮助开发者更好地理解和使用这一强大的...

    Hibernate_3.2.0_Reference_zh_CN.zip

    **标题解析:**"Hibernate_3.2.0_...通过阅读"Hibernate_3.2.0_Reference_zh_CN.chm"这个中文参考手册,开发者可以深入了解以上这些概念,学习如何在实际项目中使用Hibernate来构建高效、健壮的数据库驱动的应用程序。

    hibernate annotations 中文参考手册

    ### Hibernate Annotations 中文参考手册概览 #### 版本说明 根据提供的信息,这份文档的版本为3.2.0CR1。此版本标志着Hibernate框架中的一个特定阶段,特别是关于如何利用注解(Annotations)来简化Java对象与...

Global site tag (gtag.js) - Google Analytics