I don't know how can I mapping a custom query with stored Functions in Spring Boot with JPA.
The function has a dymanic query and return a join between several tables.
Function (Postgresql) works perfectely in Postgresql, and Hibernate try execute it, but the mapping failed. Any Suggestion please?
CREATE OR REPLACE FUNCTION getEmbargosByClientAndDesembargo(
desembargoId int, clIdentification varchar, lawType varchar)
RETURNS TABLE(uuid varchar, fecha timestamp, rub varchar, identificacion varchar, endidadLegal varchar, numeroOficio varchar, eradicado varchar, valor numeric, segmento varchar, filial varchar, estado varchar) AS
$func$
DECLARE
sql text := '';
BEGIN
IF lawType IS NOT NULL THEN
IF lawType = '1' OR lawType = '2' THEN
sql := 'WITH ent_legal
AS (SELECT E.id_embargo,
D.entidad_legal_nombre AS ENT_DES
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
INNER JOIN desembargos D
ON D.id_desembargo = ED.fk_id_desembargo
WHERE D.id_desembargo = $1
AND E.cliente_identificacion = $2
AND E.ley_tipo = $3
AND E.entidad_legal_nombre = D.entidad_legal_nombre),
rad
AS (SELECT E.id_embargo,
D.radicado AS RAD_DES
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
INNER JOIN desembargos D
ON D.id_desembargo = ED.fk_id_desembargo
WHERE D.id_desembargo = $1
AND E.cliente_identificacion = $2
AND E.ley_tipo = $3
AND E.radicado = D.radicado),
dem_iden
AS (SELECT E.id_embargo,
D.demandante_identificacion AS DEM_ID_DES
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
INNER JOIN desembargos D
ON D.id_desembargo = ED.fk_id_desembargo
WHERE D.id_desembargo = $1
AND E.cliente_identificacion = $2
AND E.ley_tipo = $3
AND E.demandante_identificacion = D.demandante_identificacion),
fec_asc
AS (SELECT E.id_embargo,
E.fecha AS FECHA_DES
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
INNER JOIN desembargos D
ON D.id_desembargo = ED.fk_id_desembargo
WHERE D.id_desembargo = $1
AND E.ley_tipo = $3
AND E.cliente_identificacion = $2
AND E.demandante_identificacion != D.demandante_identificacion
AND E.radicado != D.radicado
AND E.entidad_legal_nombre != D.entidad_legal_nombre
ORDER BY E.fecha ASC)
SELECT Cast(Uuid_generate_v4() AS VARCHAR) id,
E.fecha,
E.rub,
E.cliente_identificacion,
E.entidad_legal_nombre,
E.oficio_numero,
E.radicado,
E.valor,
E.cliente_segmento,
E.filial,
E.estado
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
LEFT JOIN ent_legal EL
ON E.id_embargo = EL.id_embargo
LEFT JOIN rad R
ON R.id_embargo = E.id_embargo
LEFT JOIN dem_iden DI
ON DI.id_embargo = E.id_embargo
WHERE ED.fk_id_desembargo = $1
AND E.cliente_identificacion = $2
AND E.ley_tipo = $3 ';
ELSE
sql:='SELECT Cast(Uuid_generate_v4() AS VARCHAR) id,
E.fecha,
E.rub,
E.cliente_identificacion,
E.entidad_legal_nombre,
E.oficio_numero,
E.radicado,
E.valor,
E.cliente_segmento,
E.filial,
E.estado
FROM embargos E
INNER JOIN embargos_desembargos ED
ON E.id_embargo = ED.fk_id_embargo
WHERE ED.fk_id_desembargo = $1
AND E.cliente_identificacion = $2
AND E.ley_tipo = $3 ';
END IF;
IF lawType = '1' OR lawType = '2' THEN
sql:=sql||' ORDER BY CASE
WHEN ( E.entidad_legal_nombre = EL.ent_des ) THEN 0
WHEN ( E.radicado = R.rad_des ) THEN 1
WHEN ( E.demandante_identificacion = DI.dem_id_des ) THEN 2
END';
ELSE
sql:= sql||' ORDER BY E.FECHA ASC';
END IF;
END IF;
RETURN QUERY EXECUTE sql
USING desembargoId, clIdentification, lawType;
END
$func$ LANGUAGE plpgsql;
Now, CrudRepository class is:
public interface EmbargoClientDataRepository extends CrudRepository<EmbargoData, Integer>,
QueryByExampleExecutor<EmbargoData> {
@Query(nativeQuery = true,
value = "SELECT getEmbargosByClientAndDesembargo(:idDesembargo, :identification, :lawType)")
List<EmbargoByDesembargoClientLawTypeData> getEmbargosByDesembargoClientLawType(
@Param("idDesembargo") Integer idDesembargo,
@Param("identification") String identification,
@Param("lawType") String lawType);
}
You may notice that Repository Class is diferent that query result, that is the problem, I don't know how can I get a specific model from my Function, I think this the error... EmbargoByDesembargoClientLawTypeData, it's a simple class, because the Entity class can't mapping the custom columns of the query function. EmbargoByDesembargoClientLawTypeData Class:
@Data
@AllArgsConstructor
public class EmbargoByDesembargoClientLawTypeData {
private String uuid;
private LocalDateTime fecha;
private String rub;
private String identificacion;
private String endidadLegal;
private String numeroOficio;
private String eradicado;
private Double valor;
private String segmento;
private String filial;
private String estado;
}
The error is:
nested exception is org.springframework.orm.jpa.JpaSystemException: No Dialect mapping for JDBC type: 1111; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111] with root cause
** UPDATE **
People, as the article was marked as "Closed" but the suggestion not works for me, I want to share my solution from this Article.