From 1fc8552e2678a2dc4f71374c4fe42ddcf4fac1c7 Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 20 Jan 2026 14:22:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B6=94=EB=A1=A0=20=EA=B2=B0=EA=B3=BC=20geom?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MapSheetLearnRepositoryImpl.java | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index 7c249633..48ba9e7f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -24,6 +24,7 @@ import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelMngEntity; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberExpression; @@ -360,42 +361,51 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto @Override public Page getInferenceGeomList(UUID uuid, SearchGeoReq searchGeoReq) { Pageable pageable = searchGeoReq.toPageable(); - BooleanBuilder builder = new BooleanBuilder(); + BooleanBuilder where = new BooleanBuilder(); - // analUid로 분석 정보 조회 + // 1) 분석 엔티티 조회 MapSheetLearnEntity analEntity = queryFactory .selectFrom(mapSheetLearnEntity) .where(mapSheetLearnEntity.uuid.eq(uuid)) .fetchOne(); - if (Objects.isNull(analEntity)) { + if (analEntity == null) { throw new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND); } - // 추론결과 id - builder.and(mapSheetAnalInferenceEntity.learnId.eq(analEntity.getId())); + // 2) where 조건 + where.and(mapSheetAnalInferenceEntity.learnId.eq(analEntity.getId())); - // 기준년도 분류 - if (searchGeoReq.getTargetClass() != null && !searchGeoReq.getTargetClass().equals("")) { - builder.and( + if (searchGeoReq.getTargetClass() != null && !searchGeoReq.getTargetClass().isBlank()) { + where.and( mapSheetAnalDataInferenceGeomEntity.classAfterCd.eq( searchGeoReq.getTargetClass().toLowerCase())); } - // 비교년도 분류 - if (searchGeoReq.getCompareClass() != null && !searchGeoReq.getCompareClass().equals("")) { - builder.and( + if (searchGeoReq.getCompareClass() != null && !searchGeoReq.getCompareClass().isBlank()) { + where.and( mapSheetAnalDataInferenceGeomEntity.classBeforeCd.eq( searchGeoReq.getCompareClass().toLowerCase())); } - // 분석도엽 if (searchGeoReq.getMapSheetNum() != null) { - Long mapSheetNum = searchGeoReq.getMapSheetNum(); - builder.and(mapSheetAnalDataInferenceGeomEntity.mapSheetNum.like("%" + mapSheetNum + "%")); + // + // where.and(mapSheetAnalDataInferenceGeomEntity.mapSheetNum.eq(searchGeoReq.getMapSheetNum())); + where.and( + mapSheetAnalDataInferenceGeomEntity.mapSheetNum.like( + "%" + searchGeoReq.getMapSheetNum() + "%")); } + // 3) inkx 조인 조건: JPQL/HQL에서 '~' 불가 → function('regexp_match', ...) 사용 + BooleanExpression inkxIsNumeric = + Expressions.booleanTemplate( + "function('regexp_match', {0}, '^[0-9]+$') is not null", mapInkx5kEntity.mapidcdNo); + + NumberExpression inkxNoAsLong = + Expressions.numberTemplate(Long.class, "cast({0} as long)", mapInkx5kEntity.mapidcdNo); + + // 4) content List content = queryFactory .select( @@ -411,45 +421,32 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto mapSheetAnalDataInferenceGeomEntity.classAfterCd, mapSheetAnalDataInferenceGeomEntity.classAfterProb, mapSheetAnalDataInferenceGeomEntity.mapSheetNum, - mapInkx5kEntity.mapidNm - // Expressions.stringTemplate( - // "ST_AsGeoJSON({0})", - // mapSheetAnalDataInferenceGeomEntity.geom), - // Expressions.stringTemplate( - // "ST_AsGeoJSON({0})", - // mapSheetAnalDataInferenceGeomEntity.geomCenter) - )) + mapInkx5kEntity.mapidNm)) .from(mapSheetAnalInferenceEntity) .join(mapSheetAnalDataInferenceEntity) .on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) .join(mapSheetAnalDataInferenceGeomEntity) .on(mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id)) .join(mapInkx5kEntity) - .on( - mapSheetAnalDataInferenceGeomEntity.mapSheetNum.eq( - Expressions.numberTemplate( - Long.class, "CAST({0} AS long)", mapInkx5kEntity.mapidcdNo))) - .where(builder) + .on(inkxIsNumeric.and(mapSheetAnalDataInferenceGeomEntity.mapSheetNum.eq(inkxNoAsLong))) + .where(where) + .orderBy(mapSheetAnalDataInferenceGeomEntity.geoUid.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - long total = + // 5) total (조인 최소화 유지) + Long total = queryFactory - .select(mapSheetAnalDataInferenceGeomEntity.geoUid) + .select(mapSheetAnalDataInferenceGeomEntity.geoUid.count()) .from(mapSheetAnalInferenceEntity) .join(mapSheetAnalDataInferenceEntity) .on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) .join(mapSheetAnalDataInferenceGeomEntity) .on(mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id)) - .join(mapInkx5kEntity) - .on( - mapSheetAnalDataInferenceGeomEntity.mapSheetNum.eq( - Expressions.numberTemplate( - Long.class, "CAST({0} AS long)", mapInkx5kEntity.mapidcdNo))) - .where(builder) - .fetchCount(); + .where(where) + .fetchOne(); - return new PageImpl<>(content, pageable, total); + return new PageImpl<>(content, pageable, total == null ? 0L : total); } }