Как я могу получить StoredFunction с JPA и Spring Boot

Я не знаю, как сопоставить пользовательский запрос с сохраненными функциями в Spring Boot с JPA.

Функция имеет динамический запрос и возвращает соединение между несколькими таблицами.

Функция (Postgresql) отлично работает в Postgresql, и Hibernate пытается выполнить ее, но сопоставление не удалось. Любое предложение, пожалуйста?

        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;

Теперь класс CrudRepository:

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);
}

Вы можете заметить, что класс репозитория отличается от результата запроса, это проблема, я не знаю, как получить конкретную модель из моей функции, я думаю, что это ошибка ... EmbargoByDesembargoClientLawTypeData, это простой класс, потому что класс Entity не может отображать настраиваемые столбцы функции запроса. Класс EmbargoByDesembargoClientLawTypeData:

@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;
}

Ошибка:

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

** ОБНОВИТЬ **

Люди, так как статья была помечена как "Закрытая", но предложение не работает для меня, я хочу поделиться своим решением из этого Статья.


person juan Zuluaga    schedule 25.05.2020    source источник
comment
Возможно, вы захотите взглянуть на этот другой ответ   -  person Edwin Dalorzo    schedule 25.05.2020