16.3. 定制SQL用来create,update和delete

Hibernate3能够使用定制的SQL语句来执行create,update和delete操作。在Hibernate中,持久化的类和集合已经 包含了一套配置期产生的语句(insertsql, deletesql, updatesql等等),这些映射标记 <sql-insert>, <sql-delete>, and <sql-update>重载了 这些语句。

  1. <class name="Person">
  2. <id name="id">
  3. <generator class="increment"/>
  4. </id>
  5. <property name="name" not-null="true"/>
  6. <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
  7. <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
  8. <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
  9. </class>

这些SQL直接在你的数据库里执行,所以你可以自由的使用你喜欢的任意语法。但如果你使用数据库特定的语法, 这当然会降低你映射的可移植性。

如果设定callable,则能够支持存储过程了。

  1. <class name="Person">
  2. <id name="id">
  3. <generator class="increment"/>
  4. </id>
  5. <property name="name" not-null="true"/>
  6. <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
  7. <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
  8. <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
  9. </class>

参数的位置顺序是非常重要的,他们必须和Hibernate所期待的顺序相同。

你能够通过设定日志调试级别为org.hiberante.persister.entity,来查看Hibernate所期待的顺序。在这个级别下, Hibernate将会打印出create,update和delete实体的静态SQL。(如果想看到预计的顺序。记得不要将定制SQL包含在映射文件里, 因为他们会重载Hibernate生成的静态SQL。)

在大多数情况下(最好这么做),存储过程需要返回插入/更新/删除的行数,因为Hibernate对语句的成功执行有些运行时的检查。 Hibernate常会把进行CUD操作的语句的第一个参数注册为一个数值型输出参数。

  1. CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2)
  2. RETURN NUMBER IS
  3. BEGIN
  4. update PERSON
  5. set
  6. NAME = uname,
  7. where
  8. ID = uid;
  9. return SQL%ROWCOUNT;
  10. END updatePerson;