16.3. 作成、更新、削除のためのカスタム SQL

Hibernate3 は作成、更新、削除処理のためのカスタム SQL 文を使用できます。クラスとコレクションの永続化機構は、コンフィグレーション時に生成された文字列 (insertsql、deletesql、updatesql など)のセットをすでに保持しています。これらの文字列より、 <sql-insert><sql-delete><sql-update> というマッピングタグが優先されます:
<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>
SQL を直接データベースで実行するため、好みの方言を自由に使用できます。データベース独自の SQL を使えば、マッピングの移植性が下がります。
callable 属性をセットすれば、ストアドプロシージャを使用できます:
<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>
Hibernate が期待する順序と同じでなければならないため、位置パラメータの順番はとても重要です。
org.hiberante.persister.entity レベルのデバッグログを有効にすることによって、期待される順番を参照できます。このレベルを有効にすることにより、Hibernate は、エンティティの作成、更新、削除などで使用される静的な SQL を出力します。期待される順序を確認する際、マッピングファイルにカスタムSQLを含めないでください。含めてしまうと、Hibernate が生成する静的 SQL をオーバーライドするためです。
ストアドプロシージャは多くの場合、挿入/更新/削除された行数を返す必要があります。実行時に Hibernate が 文の成功をチェックするからです。Hibernate は、 CUD 操作で数値の出力パラメータとして、SQL 文の最初のパラメータをいつも記録します:
CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2)
    RETURN NUMBER IS
BEGIN

    update PERSON
    set
        NAME = uname,
    where
        ID = uid;

    return SQL%ROWCOUNT;

END updatePerson;