1

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.

0 Answers0