1. 개요
Entity에 List<String>이 있고 이를 검색하는 코드를 구현하고자 한다.
결과 원하면 빠르게 3번만 보면 된다.
상황을 더 설명하자면 게시물에 tagList라는 List<String> 형태의 태그 프로퍼티가 있고, 사용자가 태그 검색을 할 때 리스트를 검색 결과에 포함시키는 방법이다.
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 |
---|