목차

반응형

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