📄 querysql.html
字号:
</p><div class="itemizedlist"><ul type="disc" compact><li><p>函数必须返回一个结果集。存储过程的第一个参数必须是<tt class="literal">OUT</tt>,它返回一个结果集。这是通过Oracle 9或10的<tt class="literal">SYS_REFCURSOR</tt>类型来完成的。在Oracle中你需要定义一个<tt class="literal">REF CURSOR</tt>类型,参见Oracle的手册。</p></li></ul></div><p> 对于Sybase或者MS SQL server有如下规则: </p><div class="itemizedlist"><ul type="disc" compact><li><p> 存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值, 其他将被丢弃。 </p></li><li><p> 如果你能够在存储过程里设定<tt class="literal">SET NOCOUNT ON</tt>,这可能会效率更高,但这不是必需的。 </p></li></ul></div></div></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querysql-cud"></a>16.4. 定制SQL用来create,update和delete</h2></div></div><div></div></div><p> Hibernate3能够使用定制的SQL语句来执行create,update和delete操作。在Hibernate中,持久化的类和集合已经 包含了一套配置期产生的语句(insertsql, deletesql, updatesql等等),这些映射标记 <tt class="literal"><sql-insert></tt>, <tt class="literal"><sql-delete></tt>, and <tt class="literal"><sql-update></tt>重载了 这些语句。 </p><pre class="programlisting"><class name="Person"> <id name="id"> <generator class="increment"/> </id> <property name="name" not-null="true"/> <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert> <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update> <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete></class></pre><p> 这些SQL直接在你的数据库里执行,所以你可以自由的使用你喜欢的任意语法。但如果你使用数据库特定的语法, 这当然会降低你映射的可移植性。 </p><p> 如果设定<tt class="literal">callable</tt>,则能够支持存储过程了。 </p><pre class="programlisting"><class name="Person"> <id name="id"> <generator class="increment"/> </id> <property name="name" not-null="true"/> <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert> <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete> <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update></class></pre><p> 参数的位置顺序是非常重要的,他们必须和Hibernate所期待的顺序相同。 </p><p> 你能够通过设定日志调试级别为<tt class="literal">org.hiberante.persister.entity</tt>,来查看Hibernate所期待的顺序。在这个级别下, Hibernate将会打印出create,update和delete实体的静态SQL。(如果想看到预计的顺序。记得不要将定制SQL包含在映射文件里, 因为他们会重载Hibernate生成的静态SQL。) </p><p> 在大多数情况下(最好这么做),存储过程需要返回插入/更新/删除的行数,因为Hibernate对语句的成功执行有些运行时的检查。 Hibernate常会把进行CUD操作的语句的第一个参数注册为一个数值型输出参数。 </p><pre class="programlisting">CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2) RETURN NUMBER ISBEGIN update PERSON set NAME = uname, where ID = uid; return SQL%ROWCOUNT;END updatePerson;</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querysql-load"></a>16.5. 定制装载SQL</h2></div></div><div></div></div><p> 你可能需要声明你自己的SQL(或HQL)来装载实体 </p><pre class="programlisting"><sql-query name="person"> <return alias="pers" class="Person" lock-mode="upgrade"/> SELECT NAME AS {pers.name}, ID AS {pers.id} FROM PERSON WHERE ID=? FOR UPDATE</sql-query></pre><p> 这只是一个前面讨论过的命名查询声明,你可以在类映射里引用这个命名查询。 </p><pre class="programlisting"><class name="Person"> <id name="id"> <generator class="increment"/> </id> <property name="name" not-null="true"/> <loader query-ref="person"/></class></pre><p> 这也可以用于存储过程 </p><p>你甚至可以定一个用于集合装载的查询:</p><pre class="programlisting"><set name="employments" inverse="true"> <key/> <one-to-many class="Employment"/> <loader query-ref="employments"/></set></pre><pre class="programlisting"><sql-query name="employments"> <load-collection alias="emp" role="Person.employments"/> SELECT {emp.*} FROM EMPLOYMENT emp WHERE EMPLOYER = :id ORDER BY STARTDATE ASC, EMPLOYEE ASC</sql-query></pre><p>你甚至还可以定义一个实体装载器,它通过连接抓取装载一个集合:</p><pre class="programlisting"><sql-query name="person"> <return alias="pers" class="Person"/> <return-join alias="emp" property="pers.employments"/> SELECT NAME AS {pers.*}, {emp.*} FROM PERSON pers LEFT OUTER JOIN EMPLOYMENT emp ON pers.ID = emp.PERSON_ID WHERE ID=?</sql-query></pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="querycriteria.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="filters.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 15 章 条件查询(Criteria Queries) </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 17 章 过滤数据</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -