0

結果クエリを Java Bean にマップするために、休止状態でストアド プロシージャを実行することができました。

たとえば、次の Profesor.hbm.xml というファイルがあります。

<hibernate-mapping>
        <class name="model.Profesor" table="Profesor" catalog="dbo">
            <id name="idProfesor" type="int">
                <column name="idProfesor" />
                <generator class="assigned" />
            </id>
        <property name="Nombre" type="string">
            <column name="Nombre"  length="25" not-null="false" />
        </property>
        <property name="ApellidoP" type="string">
            <column name="ApellidoP" length="20" not-null="false" />
        </property>

        <property name="ApellidoM" type="string">
            <column name="ApellidoM" length="20" not-null="false" />
        </property>
            </class>

        <sql-query name="getProfesors" callable="true">
        <return alias="getProfesors" class="model.Profesor">

        <return-property name="idProfesor" column="idProfesor"/>
        <return-property name="Nombre" column="Nombre"/>
        <return-property name="ApellidoP" column="ApellidoP"/>
        <return-property name="ApellidoM" column="ApellidoM"/>
        </return>
        exec getProfesors :idTT
        </sql-query>
</hibernate-mapping>

そして、教授のクラスには次のコードがあります。

SessionFactory sf = new Configuration().configure().buildSessionFactory();
session = sf.getCurrentSession();

public List <Profesor> getProfesors(String idTT){
    session.beginTransaction();

    query.setString("idTT", idTT);

return query.list();
}

これは完全に機能します。問題はありません。ストアド プロシージャが実行され、結果が Profesor という名前のモデル クラスに入力されます。

これで、データを INSERT してデータベースに新しい Profesor を作成する別のストアド プロシージャができました。

私はこのようなことを試みましたが成功しませんでした:

session.beginTransaction();
Connection c = session.connection();
CallableStatement cs = c.prepareCall( "{call addProfesor(?,?,?)}" ) ;
cs.setString(1, "George");
cs.setString(2, "Williams");
cs.setString(3, "Mathematics");

cs.executeUpdate();

エラーメッセージも表示されず、データが挿入されません。<"sql-query"> タグがあるように、<"sql-insert"> があることも読んでいましたが、<"sql-insert"> を呼び出す方法がわかりません。 sql-query のように「name」属性はありません。

<"sql-query"> を使用すると、次のことができます。

 Query query =session.getNamedQuery("getProfesors");

前に示したのと同じですが、sql-insert にはその属性名がないため、その方法がわかりません。また、非常に特殊な要件であるため、ストアド プロシージャを使用せざるを得ません。そうしないと、他の Hibernate 永続化機能を使用していたでしょう。

どんな助けでも本当に感謝しています。

4

2 に答える 2

1

挿入、更新、削除には「カスタムSQL」を指定できます。それに関するドキュメントを参照してください。

これらは名前付きクエリではありません。これらは、Hibernateがこのエンティティを挿入、更新、または削除するときに常に使用されます。

于 2012-04-05T05:25:19.813 に答える
0

これを行う別の方法は、プリペアド ステートメントからストアド プロシージャを呼び出すことです。これは、ストアド プロシージャが複数のレコードを更新する場合 (バッチ更新) に役立つ可能性があります。

PreparedStatement ps = getSession().connection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();

ただし、注意してください: hibernate セッションの connection() メソッドは、Hibernate 3.2.4 ( https://hibernate.onjira.com/browse/HHH-2603 ) から廃止されました。

PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider()
                    .getConnection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();
于 2012-05-14T06:31:08.523 に答える