fix: consultar catalogos foreign table por SQL nativo, no JPA entity

Hibernate ddl-auto validate falla con "missing table nuevo.area": JDBC
metadata reporta foreign tables (FDW) como FOREIGN TABLE, no TABLE, y
el schema validator solo busca TABLE. Se reemplazan las entities/repos
de area, subarea, cargo y locales por JdbcTemplate con SQL nativo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GDaQQ4oDPiTnXr2FfDLnst
parent 7ccfb528
package so.planilla_be.rentaquinta.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
@Table(name = "area", schema = "nuevo")
public class Area {
@Id
@Column(name = "codarea")
private Integer codarea;
@Column(name = "desarea")
private String desarea;
}
package so.planilla_be.rentaquinta.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
@Table(name = "cargo", schema = "nuevo")
public class Cargo {
@Id
@Column(name = "codcargo")
private Integer codcargo;
@Column(name = "descargo")
private String descargo;
}
package so.planilla_be.rentaquinta.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
@Table(name = "locales", schema = "nuevo")
public class Local {
@Id
@Column(name = "id_local")
private Integer idLocal;
@Column(name = "deslocal")
private String deslocal;
}
package so.planilla_be.rentaquinta.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
@Table(name = "subarea", schema = "nuevo")
public class Subarea {
@Id
@Column(name = "id_subarea")
private Integer idSubarea;
@Column(name = "nombre")
private String nombre;
}
package so.planilla_be.rentaquinta.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import so.planilla_be.rentaquinta.entity.Area;
public interface AreaRepository extends JpaRepository<Area, Integer> {
}
package so.planilla_be.rentaquinta.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import so.planilla_be.rentaquinta.entity.Cargo;
public interface CargoRepository extends JpaRepository<Cargo, Integer> {
}
package so.planilla_be.rentaquinta.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import so.planilla_be.rentaquinta.entity.Local;
public interface LocalRepository extends JpaRepository<Local, Integer> {
}
package so.planilla_be.rentaquinta.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import so.planilla_be.rentaquinta.entity.Subarea;
public interface SubareaRepository extends JpaRepository<Subarea, Integer> {
}
package so.planilla_be.rentaquinta.service.impl; package so.planilla_be.rentaquinta.service.impl;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import so.planilla_be.rentaquinta.dto.FiltroItemDTO; import so.planilla_be.rentaquinta.dto.FiltroItemDTO;
import so.planilla_be.rentaquinta.dto.TipoFiltro; import so.planilla_be.rentaquinta.dto.TipoFiltro;
import so.planilla_be.rentaquinta.repository.AreaRepository;
import so.planilla_be.rentaquinta.repository.CargoRepository;
import so.planilla_be.rentaquinta.repository.LocalRepository;
import so.planilla_be.rentaquinta.repository.SubareaRepository;
import so.planilla_be.rentaquinta.service.FiltrosService; import so.planilla_be.rentaquinta.service.FiltrosService;
import java.util.List; import java.util.List;
/**
* area, subarea, cargo y locales son foreign tables (FDW) del schema "nuevo": Hibernate
* schema-validate no las reconoce (JDBC metadata las reporta como FOREIGN TABLE, no TABLE),
* por eso se consultan por SQL nativo en vez de mapearlas como @Entity.
*/
@Service @Service
public class FiltrosServiceImpl implements FiltrosService { public class FiltrosServiceImpl implements FiltrosService {
private final AreaRepository areaRepository; private final JdbcTemplate jdbcTemplate;
private final SubareaRepository subareaRepository;
private final CargoRepository cargoRepository;
private final LocalRepository localRepository;
public FiltrosServiceImpl(AreaRepository areaRepository, SubareaRepository subareaRepository, public FiltrosServiceImpl(JdbcTemplate jdbcTemplate) {
CargoRepository cargoRepository, LocalRepository localRepository) { this.jdbcTemplate = jdbcTemplate;
this.areaRepository = areaRepository;
this.subareaRepository = subareaRepository;
this.cargoRepository = cargoRepository;
this.localRepository = localRepository;
} }
@Override @Override
public List<FiltroItemDTO> listar(TipoFiltro tipo) { public List<FiltroItemDTO> listar(TipoFiltro tipo) {
return switch (tipo) { String sql = switch (tipo) {
case AREA -> areaRepository.findAll().stream() case AREA -> "select codarea as id, desarea as text from nuevo.area order by desarea";
.map(a -> new FiltroItemDTO(a.getCodarea(), a.getDesarea())) case SUBAREA -> "select id_subarea as id, nombre as text from nuevo.subarea order by nombre";
.toList(); case CARGO -> "select codcargo as id, descargo as text from nuevo.cargo order by descargo";
case SUBAREA -> subareaRepository.findAll().stream() case LOCAL -> "select id_local as id, deslocal as text from nuevo.locales order by deslocal";
.map(s -> new FiltroItemDTO(s.getIdSubarea(), s.getNombre()))
.toList();
case CARGO -> cargoRepository.findAll().stream()
.map(c -> new FiltroItemDTO(c.getCodcargo(), c.getDescargo()))
.toList();
case LOCAL -> localRepository.findAll().stream()
.map(l -> new FiltroItemDTO(l.getIdLocal(), l.getDeslocal()))
.toList();
}; };
return jdbcTemplate.query(sql,
(rs, rowNum) -> new FiltroItemDTO(rs.getInt("id"), rs.getString("text")));
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment