2016-12-02 9 views
1

私はUsing dynamic query in Liferayを参照し、MySQL 5.5を使用していますが、複数のエンティティを含むカスタムクエリの代わりに、ストアドプロシージャを呼び出す必要があります。 私たちは、カスタムクエリを含む、default.xmlのでliferayでストアドプロシージャを呼び出す方法は?

delimiter // 
Create Procedure proc_check (OUT count INT) 
begin 
select count(*) into count from lg_office ; 
end// 

サンプルプロシージャを作成している、私たちはそれぞれのファインダー方式で

<sql id="de.uhh.l2g.plugins.service.persistence.ProducerFinder.findOfficeCount"> 
     <![CDATA[ 
      Call proc_check(@output) 
     ]]> 
    </sql> 

を使用していた、我々は、ストアドプロシージャを呼び出すには、以下のスニペットを使用しました開始と終了の両方で-1を渡します。

String sql = CustomSQLUtil.get(FIND_OFFICE_COUNT); 
      SQLQuery q = session.createSQLQuery(sql); 
      QueryPos qPos = QueryPos.getInstance(q); 
      //qPos.add(lectureseriesId); 
      List <Integer> sl = (List<Integer>) QueryUtil.list(q, getDialect(), begin, end); 
      return sl; 

QueryUtilでは、コールを実行するための他の適切なメソッドが見つかりませんでした。 ポストは、この私たちは、以下のエラー

ERROR [RuntimePageImpl-5][JDBCExceptionReporter:82] ResultSet is from UPDATE. No Data. 

このアプローチは欠けている何かで正しいかどう、同じことを達成するためのアプローチを提案してくださいに取得します。

+0

この方法のように、JDBC APIを使用することができますあなたがcallaストアドプロシージャを必要としているのを聞いて、カウント操作を行うのが奇妙です。これが正しい方法だと確信していますか? –

+1

@DanieleBaggioこれは実際のテストでは機能していないためです。 –

答えて

0

これを見て、試してみてください。

session = openSession(); 
String sql = CustomSQLUtil.get(DELETE_BY_PROJETID); 
SQLQuery query = session.createSQLQuery(sql); 
query.setCacheable(false); 
QueryPos qPos = QueryPos.getInstance(query); 
qPos.add(projectId); 
query.executeUpdate(); 

https://web.liferay.com/it/community/forums/-/message_boards/message/37490823

+0

これを試してみましたが、ストアドプロシージャの実行結果をどのように出力するのですか? –

0

がビルトインのLiferayの任意のユーティリティは、ストアドプロシージャを呼び出すことはありませんが、あなただけのDataAccess.getConnection();との接続を取得し、

Connection connection =DataAccess.getConnection(); 
CallableStatement cs = connection.prepareCall("{Call proc_check(@output)}"); 
ResultSet rs = cs.executeQuery(); 
関連する問題