17.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;