0

私は、結果クエリをJava Beanにマッピングするために、hibernateでストアドプロシージャを実行することができました。HibernateからINSERTのSQL Serverストアドプロシージャを実行するには?

例えば、私は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> 

をそして、私のProfesorクラスで私は、次のコードを持っている:

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という名前のモデルクラスに結果が設定されます。

今私はデータベースに新しい教授を作成するためにデータを挿入する別のストアドプロシージャを持っています。

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"属性を持たないからです。私は前に示したと同じように

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

を、しかし、SQL-挿入doesntのは、その属性名を持っているので、私はどのように行うのか分からない:

は<「SQLクエリ」で>我々は行うことができます。私はまた、非常に特別な要件であるためストアドプロシージャを使用することを余儀なくされました。そうでなければ、他のHibernate永続性機能を使用していました。

本当にありがとうございます。

+0

それは非常にありますすべてのストアドプロシージャを使用するようにORMを構成するのは複雑です。私はちょうどあなたが選択によってこれを行うべきではないことを意味します。 –

答えて

0

これを行う別の方法は、プリコンパイルされたステートメントからストアドプロシージャを呼び出すことです。これは、ストアドプロシージャが複数のレコードを更新する場合(バッチ更新)に便利です。

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

しかし注意してください:のセッションの接続()メソッドは、一時的に休止状態3.2.4(https://hibernate.onjira.com/browse/HHH-2603) ので、この廃止の代替を推奨されていません休止状態、我々は使用することができます。

PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider() 
        .getConnection().prepareStatement("{exec sp_batchRateUpdate}"); 
ps.execute(); 
1

挿入、更新、削除に「カスタムSQL」を指定できます。約the documentationを参照してください。

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

+0

私はそのドキュメントをチェックして、このコード行を追加してProfesor.hbm.xmlを修正しようとしました: {call addProfesor(?、?、?、?、?)} タグ内に がありますが、Javaコードから呼び出す方法がわかりません。どうか助けてください –

+0

私はどこかで私を導くことができますか? –

+0

javaから直接呼び出さないでください。エンティティが挿入されると常に呼び出されます。 –

関連する問題