목차

반응형

1. 개요

Entity에 List<String>이 있고 이를 검색하는 코드를 구현하고자 한다.
결과 원하면 빠르게 3번만 보면 된다.

상황을 더 설명하자면 게시물에 tagList라는 List<String> 형태의 태그 프로퍼티가 있고, 사용자가 태그 검색을 할 때 리스트를 검색 결과에 포함시키는 방법이다.

DB 담겨져 있는 상황
Entity 정의

 

2. 관련 에러

private BooleanExpression hasKeyword(QCampaign qCampaign, String keyword)
    {
        if (keyword == null || keyword.equals(""))
        {
            return null;
        }


        BooleanExpression keywordInTagList = qCampaign.tagList.any().contains(keyword);
        BooleanExpression keywordInServeText = qCampaign.serveText.containsIgnoreCase(keyword);
        BooleanExpression keywordInMissionText = qCampaign.missionText.containsIgnoreCase(keyword);
        return keywordInServeText.or(keywordInMissionText).or(keywordInTagList);
    }

이런식으로 짜면 알아서 tagList안에 keyword가 포함된 경우 true를 반환할 것이라고 생각하기 쉬우나...

 

아래와 같은 에러를 만나게 된다. 정확한 원인은 찾지 못했으나 관련 문서도 못 찾아서 패스.

Cannot invoke "org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(boolean)" because "fromElement" is null

 

3. 구현 코드

private BooleanExpression hasKeyword(QCampaign qCampaign, String keyword)
    {
        if (keyword == null || keyword.equals(""))
        {
            return null;
        }

        BooleanExpression keywordInTagList = Expressions.stringTemplate("array_to_string({0}, ', ')", qCampaign.tagList).contains(keyword);
        BooleanExpression keywordInServeText = qCampaign.serveText.containsIgnoreCase(keyword);
        BooleanExpression keywordInMissionText = qCampaign.missionText.containsIgnoreCase(keyword);
        return keywordInServeText.or(keywordInMissionText).or(keywordInTagList);
    }

해결 방법은 array_to_string이라는 postgresql 함수를 사용하여 array를 하나의 string으로 바꾸고 해당 문자에서 검색을 하는 방법이다. 코드는 위와 같다.

 

응 잘작동함~

킹아~!

반응형

'Java > Spring' 카테고리의 다른 글

codedeploy java: command not found  (0) 2023.08.23
반응형

codedeploy 사용 도중 분명 직접 배포 커맨드 실행했을때 잘 되고 java -version도 잘 작동할때, 배포 인스턴스 혼자만 java 위치를 못찾을때

 

which java 써서 java 절대경로 찾은 뒤,

기존 코드가 path에 등록된 java를 사용하는 아래 코드라면

nohup java -jar -Dserver.port=${TARGET_PORT}  -Dspring.profiles.active=${DEPLOYMENT_GROUP_NAME} -Dspring.config.location=${SPRING_PROPERTIES_PATH}  ${PROJECT_PATH}/build/libs/* > ${PROJECT_PATH}/nohup.out 2>&1 &

 

java를 절대 경로로 찾아서 빌드하는 코드로 바꿔보자

nohup /usr/java/oracle/jdk-15.0.1/bin/java -jar -Dserver.port=${TARGET_PORT}  -Dspring.profiles.active=${DEPLOYMENT_GROUP_NAME} -Dspring.config.location=${SPRING_PROPERTIES_PATH}  ${PROJECT_PATH}/build/libs/* > ${PROJECT_PATH}/nohup.out 2>&1 &

 

좀 별로긴 한데, 이딴걸로 반나절 날려버려서 그냥 이렇게 바꾸고 해결하련다.

반응형

'Java > Spring' 카테고리의 다른 글

스프링 postgresql jpa querydsl List<String> 배열 검색  (0) 2023.09.06