2016-12-02 1 views
1

Je parle de Using dynamic query in Liferay et de l'utilisation de MySQL 5.5 mais à la place de requêtes personnalisées impliquant plusieurs entités, nous devons appeler une procédure stockée. Nous avons créé une procédure d'échantillonnageComment appeler une procédure stockée dans liferay?

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

En default.xml, contenant des requêtes personnalisées, nous avons utilisé

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

Dans la méthode du Finder respective, nous avons utilisé l'extrait ci-dessous pour appeler la procédure stockée, passant -1 pour commencer et finir.

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; 

En QueryUtil, nous ne pouvions pas trouver d'autres méthodes applicables pour exécuter l'appel. ce message nous obtenons l'erreur ci-dessous

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

Cette approche est correcte avec quelque chose qui manque ou si non, s'il vous plaît suggérer approche pour atteindre le même.

+0

Il est étrange d'entendre que vous avez besoin d'une procédure calla stockée, expacially pour effectuer une opération de comptage. Êtes-vous sûr que c'est la bonne façon? –

+1

@DanieleBaggio C'est juste à des fins de test que le réel ne fonctionnait pas! –

Répondre

0

Regardez ceci, essayez-le.

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

Je l'avais essayé mais comment puis-je obtenir la sortie de l'exécution stockée proc? –

0

il n'y a aucune utilité intégrée dans Liferay pour appeler la procédure stockée, mais vous pouvez simplement obtenir la connexion avec DataAccess.getConnection(); et utiliser l'api jdbc comme cette façon

Connection connection =DataAccess.getConnection(); 
CallableStatement cs = connection.prepareCall("{Call proc_check(@output)}"); 
ResultSet rs = cs.executeQuery();