Как вызвать хранимую процедуру в liferay?
Я имею в виду Использование динамического запроса в Liferay и использование MySQL 5.5, но вместо пользовательских запросов, включающих несколько объектов, нам нужно вызвать хранимую процедуру. Мы создали образец процедуры
delimiter //
Create Procedure proc_check (OUT count INT)
begin
select count(*) into count from lg_office ;
end//
В default.xml, содержащем пользовательские запросы, мы использовали
<sql id="de.uhh.l2g.plugins.service.persistence.ProducerFinder.findOfficeCount">
<![CDATA[
Call proc_check(@output)
]]>
</sql>
В соответствующем методе Finder мы использовали приведенный ниже фрагмент для вызова хранимой процедуры, передавая -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.
Является ли этот подход правильным, если что-то отсутствует, или, если нет, предложите подход для достижения того же.
2 ответа
В liferay нет встроенной утилиты для вызова хранимой процедуры, но вы можете просто установить соединение с DataAccess.getConnection();
и использовать API JDBC, как этот способ
Connection connection =DataAccess.getConnection();
CallableStatement cs = connection.prepareCall("{Call proc_check(@output)}");
ResultSet rs = cs.executeQuery();
Посмотри на это, попробуй.
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