Я не знаю, как сопоставить пользовательский запрос с сохраненными функциями в 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
** ОБНОВИТЬ **
Люди, так как статья была помечена как "Закрытая", но предложение не работает для меня, я хочу поделиться своим решением из этого Статья.