Как сопоставить пользовательскую таблицу, возвращенную из хранимой процедуры

-4

Я использую postgresql и hibernate, у меня есть хранимая процедура, которая возвращает пользовательскую таблицу, как я сопоставляю java bean с этой настраиваемой таблицей? Я написал класс java, но не уверен, следует ли использовать аннотации.

мой SP:

CREATE OR REPLACE FUNCTION reporte_gas_federal()
RETURNS TABLE(tipologia text, "Número de clientes" bigint, "Saturación de mercado" text, "Distribución clientes nivel federal" text) AS
$BODY$

WITH cruce_tipo_gas
AS (SELECT wise_ageb.id_ageb,
wise_ageb.cvgeo_ageb,
wise_ageb.tipo,
nombre,tipologias_ageb.clave,
wise_ageb_geom.geom
FROM wise_ageb
JOIN wise_ageb_geom
ON wise_ageb.id_ageb = wise_ageb_geom.id_ageb
JOIN tipologias_ageb
ON tipologias_ageb.id_ageb = wise_ageb.id_ageb
JOIN tipologias
ON tipologias_ageb.clave = tipologias.clave),
conteo_parcial
AS (SELECT DISTINCT nombre,
Count(nombre) AS conteo
FROM gasnatural_clientes
INNER JOIN cruce_tipo_gas
ON St_intersects(cruce_tipo_gas.geom,
gasnatural_clientes.geom)
GROUP BY( nombre )
ORDER BY nombre ASC),
cruce_manzana
AS (--obtiene cruce de las manzanas para pobtnener datos de pob
SELECT id_manzana,
clave
FROM wise_manzana
JOIN cruce_tipo_gas using(id_ageb)),
pob_tipologia --poblacio total x tipologia
AS (SELECT Sum(Cast(pobtot AS INT))AS poblacion,
clave
FROM wise_manzana_poblacion
JOIN cruce_manzana using (id_manzana)
GROUP BY clave),

conteo_total_pob --poblacion total en la region
AS (SELECT Sum(poblacion) AS pobtot
FROM pob_tipologia),
conteo_total
AS (SELECT Sum(conteo) AS total
FROM conteo_parcial)
SELECT
nombre as "Tipología",conteo as "Número de clientes",
CONCAT( ROUND(( ( conteo / total ) * 100 ),4),'%') AS "Saturación de mercado",
Concat(Round(( Cast(conteo AS DECIMAL) / pobtot ) * 100, 4), '%') AS "Distribución clientes nivel federal"

FROM conteo_parcial
CROSS JOIN conteo_total
CROSS JOIN conteo_total_pob order by conteo desc;

$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION reporte_gas_federal()
OWNER TO postgres;

спросил(а) 2021-01-25T23:43:16+03:00 4 месяца, 2 недели назад
1
Решение
63

Вы можете использовать RowMapper если у вас есть JdbcTemplate например:

public CustomResult getCustomResult(){
final String sql = "CALL reporte_gas_federal";
final CustomResult customResult = (CustomResult) jdbcTemplate.queryForObject(sql, new CustomResultRowMapper());

return customResult;
}

public class CustomResultRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
CustomResult customResult = new CustomResult();
customResult.set(...
...
return customResult;
}
}

В противном случае вы можете использовать ResultRansformer например:

CustomResult customResult = (CustomResult)session.createSQLQuery("CALL reporte_gas_federal")
.setResultTransformer(new BasicTransformerAdapter() {
private static final long serialVersionUID = 1L;

@Override
public Object transformTuple(Object[] tuple, String[] aliases){
final CustomResult customResult = new CustomResult();
CustomResult customResult = new CustomResult();
customResult.set(...
...
return customResult;
}
}).uniqueResult();

Или даже .setResultTransformer(Transformers.aliasToBean(CustomResult.class)) вместо настраиваемого трансформатора.

ответил(а) 2021-01-25T23:43:16+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема