AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

쿼리에 문자열 함수 사용

이 가이드 에서는 하이버네이트 ORM용 MongoDB 확장을 사용하여 문자열 필드 에서 하이버네이트 쿼리 언어(HQL) 문자열 함수를 호출하는 방법을 학습 수 있습니다. 문자열 함수를 사용하면 문자열 값을 쿼리 의 일부로 측정하고, 형식을 다시 지정하고, 결합할 수 있습니다.

SELECT 절에서 각 함수를 호출할 수 있습니다. 하이버네이트 ORM 확장은 $project 단계에서 각 함수 호출을 MongoDB 집계 표현식 으로 변환합니다. 하이버네이트 ORM 확장은 계산된 표현식 의 피연산자로서 함수 호출을 지원 하지 않기 때문에, 문자열 함수를 산술 연산자 와 결합할 수 없습니다.

최대 절전 모드 ORM 확장은 다음 문자열 함수를 지원합니다.

기능
MongoDB 번역

length(), character_length(), char_length()

upper()

lower()

concat(), ||

substring()

locate()

replace()

trim()

지정된 트림 방향에 따라 $trim, $ltrim 또는 $rtrim

pad(), lpad(), rpad()

repeat()

참고

지원되지 않는 문자열 함수

하이버네이트 ORM 확장은 HQL position(), overlay(), left(), right() 및 collate() 문자열 함수를 지원 하지 않습니다. 이러한 함수 중 하나를 호출하는 쿼리 FeatureNotSupportedException를 발생시킵니다.

지원되지 않는 문자열 함수를 사용하려면 createNativeQuery() 메서드를 호출하고 MongoDB 쿼리 언어 성명서 에 관련 연산자 포함하세요. 자세한 학습 은 네이티브 데이터베이스 쿼리 수행 가이드 참조하세요.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix.movies 컬렉션 나타내는 Movie 엔터티를 사용합니다. Movie 엔터티의 정의는 다음과 같습니다.

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.time.Instant;
import java.util.List;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private List<String> cast;
private List<String> directors;
private Instant released;
@Embedded
private Awards awards;
@OneToMany(mappedBy = "movie", fetch = FetchType.LAZY)
private List<Comment> comments;
public Movie(String title, String plot, int year, List<String> cast, List<String> directors, Instant released, Awards awards) {
this.title = title;
this.plot = plot;
this.year = year;
this.cast = cast;
this.directors = directors;
this.released = released;
this.awards = awards;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
public List<String> getDirectors() {
return directors;
}
public void setDirectors(List<String> directors) {
this.directors = directors;
}
public Awards getAwards() {
return awards;
}
public void setAwards(Awards awards) {
this.awards = awards;
}
public Instant getReleased() {
return released;
}
public void setReleased(Instant released) {
this.released = released;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
}

최대 절전 모드용 MongoDB 확장 ORM을 사용하여 이 MongoDB 샘플 컬렉션과 상호 작용하는 Java 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.

이 가이드 의 예시에서는 String 값을 저장하는 Movie 엔터티의 title 필드 사용합니다.

length(str) 함수는 문자열의 문자 수를 반환합니다. 이 함수를 동일한 함수의 별칭인 character_length(str) 또는 char_length(str)로 호출할 수도 있습니다. 하이버네이트 ORM 확장은 호출을 $strLenCP 연산자 로 변환하기 때문에 함수는 바이트가 아닌 유니코드 코드 포인트를 계산합니다.

다음 예시 sample_mflix.movies 컬렉션 에 있는 "The Hunger Games" 영화의 제목과 제목의 길이를 반환합니다.

var lengthResult = session.createQuery(
"select title, length(title) as titleLength from Movie where title = :title",
Object[].class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var row : lengthResult) {
System.out.println("Title: " + row[0] + ", Length: " + row[1]);
}
var lengthResult = entityManager.createQuery(
"select m.title, length(m.title) as titleLength from Movie m where m.title = :title",
Object[].class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var row : lengthResult) {
System.out.println("Title: " + row[0] + ", Length: " + row[1]);
}

하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.

{
"$project": {
"title": true,
"titleLength": {
"$strLenCP": "$title"
},
"_id": 0
}
}

upper(str) 및 lower(str) 함수는 문자열을 대문자 또는 소문자로 변환합니다.

다음 예시 "The Hunger Games" 영화의 제목을 대문자로 반환합니다.

var upperResult = session.createQuery(
"select upper(title) as upperTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var upperTitle : upperResult) {
System.out.println("Uppercase Title: " + upperTitle);
}
var upperResult = entityManager.createQuery(
"select upper(m.title) as upperTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var upperTitle : upperResult) {
System.out.println("Uppercase Title: " + upperTitle);
}

하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.

{
"$project": {
"upperTitle": {
"$toUpper": "$title"
},
"_id": 0
}
}

concat(x, y) 함수는 두 개 이상의 값을 단일 문자열로 결합합니다. 하이버네이트 ORM 확장은 조인하기 전에 각 피연산자를 문자열로 변환하므로 숫자 값을 연결하거나 숫자 값을 문자열 값에 연결할 수 있습니다.

다음 예시 "The Hunger Games" 영화의 제목에 점 추가합니다.

var concatResult = session.createQuery(
"select concat(title, '!') as excitedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var excitedTitle : concatResult) {
System.out.println("Concatenated Title: " + excitedTitle);
}
var concatResult = entityManager.createQuery(
"select concat(m.title, '!') as excitedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var excitedTitle : concatResult) {
System.out.println("Concatenated Title: " + excitedTitle);
}

팁

이중 파이프 연산자 (||)를 사용하여 두 값을 결합할 수도 있습니다. 다음 쿼리 앞의 예시 와 동일합니다.

"select title || '!' as excitedTitle from Movie where title = :title"

하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.

{
"$project": {
"excitedTitle": {
"$concat": [
{ "$toString": "$title" },
{ "$toString": "!" }
]
},
"_id": 0
}
}

substring(str, start) 함수는 start 위치에서 시작하는 문자열 부분을 반환합니다. start 위치는 1을 기준으로 하므로 문자열의 첫 번째 문자는 1 위치에 있습니다. 결과를 고정된 문자 수로 제한하려면 함수를 substring(str, start, length)(으)로 호출합니다.

0의 start 위치 또는 음수 값을 전달하면 하이버네이트 ORM 확장은 문자열의 시작 부분부터 읽습니다. length도 전달하는 경우 확장자는 반환된 길이에서 첫 번째 위치 이전의 문자를 뺍니다. 예시 들어 substring(str, -1, 3)은 한 문자를 반환하고 substring(str, 0, 3)는 두 문자를 반환합니다.

다음 예시 "The Hunger Games" 영화 제목의 처음 6자를 반환합니다.

var substringResult = session.createQuery(
"select substring(title, 1, 6) as titlePrefix from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var titlePrefix : substringResult) {
System.out.println("Title Prefix: " + titlePrefix);
}
var substringResult = entityManager.createQuery(
"select substring(m.title, 1, 6) as titlePrefix from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var titlePrefix : substringResult) {
System.out.println("Title Prefix: " + titlePrefix);
}

locate(pattern, str) 함수는 문자열에서 pattern 가 처음 발생한 위치의 1부터 시작하는 위치를 반환하거나, 문자열에 패턴 포함되지 않은 경우 0 를 반환합니다.

특정 위치에서 검색 시작하려면 함수를 locate(pattern, str, start)(으)로 호출합니다. start 위치는 1을 기준으로 하기 때문에 문자열의 첫 번째 문자는 1 위치에 있습니다. start 값 0 또는 음수는 1 위치에서 검색 시작합니다.

다음 예시 "The Hunger Games" 영화의 제목에서 하위 문자열 "Hunger"의 위치를 반환합니다.

var locateResult = session.createQuery(
"select locate('Hunger', title) as position from Movie where title = :title",
Integer.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var position : locateResult) {
System.out.println("Position: " + position);
}
var locateResult = entityManager.createQuery(
"select locate('Hunger', m.title) as position from Movie m where m.title = :title",
Integer.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var position : locateResult) {
System.out.println("Position: " + position);
}

replace(str, pattern, replacement) 함수는 문자열에서 pattern이 발생하는 모든 것을 replacement로 대체합니다. 하이버네이트 ORM 확장은 호출을 $replaceAll 연산자 로 변환합니다. 세 개의 인수는 모두 문자열이어야 합니다.

다음 예시 "The Hunger Games" 영화 제목에서 하위 문자열 "Hunger"을 "Video"로 바꿉니다.

var replaceResult = session.createQuery(
"select replace(title, 'Hunger', 'Video') as newTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var newTitle : replaceResult) {
System.out.println("New Title: " + newTitle);
}
var replaceResult = entityManager.createQuery(
"select replace(m.title, 'Hunger', 'Video') as newTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var newTitle : replaceResult) {
System.out.println("New Title: " + newTitle);
}

trim(str) 함수는 문자열에서 선행 및 후행 공백을 제거합니다. 문자열의 한쪽 끝에서만 문자를 제거 하려면 trim(leading char from str) 또는 trim(trailing char from str)를 사용합니다. 문자열의 양쪽 끝에서 공백이 아닌 문자를 제거 하려면 trim(both char from str)와 같이 both 및 from 키워드를 사용하여 지정합니다.

다음 예시 "The Hunger Games" 영화의 제목에서 선행 "T" 문자를 제거합니다.

var trimResult = session.createQuery(
"select trim(leading 'T' from title) as trimmedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var trimmedTitle : trimResult) {
System.out.println("Trimmed Title: " + trimmedTitle);
}
var trimResult = entityManager.createQuery(
"select trim(leading 'T' from m.title) as trimmedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var trimmedTitle : trimResult) {
System.out.println("Trimmed Title: " + trimmedTitle);
}

하이버네이트 ORM 확장은 앞의 쿼리 다음 $project 단계로 변환합니다.

{
"$project": {
"trimmedTitle": {
"$ltrim": {
"chars": "T",
"input": "$title"
}
},
"_id": 0
}
}

pad(str with length leading) 및 pad(str with length trailing) 함수는 문자열 str의 시작 또는 끝에 공백을 추가하여 문자열을 지정된 length까지 확장합니다. 공백 이외의 문자를 사용하려면 pad(str with 20 leading char)와 같이 방향 뒤에 문자를 지정합니다.

두 개 이상의 문자를 포함할 수 있는 값으로 문자열을 채우는 lpad(str, length, padding) 및 rpad(str, length, padding) 함수를 호출할 수도 있습니다. 하이버네이트 ORM 확장은 패딩 값을 필요한 만큼 반복하고 대상 길이에 도달하도록 잘라냅니다. 예시 들어, lpad('x', 6, 'ab')는 "ababax"을 반환합니다.

이러한 경우 패딩은 다음과 같이 작동합니다.

  • 대상 길이가 문자열보다 짧은 경우, Hibernate ORM 확장은 대상 길이 뒤의 후행 문자를 제거하여 문자열을 대상 길이로 자릅니다.

  • 대상 길이가 음수이면 함수는 빈 문자열을 반환합니다.

  • 패딩 값이 빈 문자열인 경우 함수는 원래 문자열을 반환합니다.

다음 예시 선행 별표를 사용하여 "The Hunger Games" 영화의 제목을 20자로 채웁니다:

var padResult = session.createQuery(
"select pad(title with 20 leading '*') as paddedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var paddedTitle : padResult) {
System.out.println("Padded Title: " + paddedTitle);
}
var padResult = entityManager.createQuery(
"select pad(m.title with 20 leading '*') as paddedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var paddedTitle : padResult) {
System.out.println("Padded Title: " + paddedTitle);
}

repeat(str, count) 함수는 str의 count 사본이 포함된 문자열을 반환합니다.

다음 예시 "The Hunger Games" 영화의 제목을 두 번 반복하여 반환합니다.

var repeatResult = session.createQuery(
"select repeat(title, 2) as repeatedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var repeatedTitle : repeatResult) {
System.out.println("Repeated Title: " + repeatedTitle);
}
var repeatResult = entityManager.createQuery(
"select repeat(m.title, 2) as repeatedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var repeatedTitle : repeatResult) {
System.out.println("Repeated Title: " + repeatedTitle);
}

쿼리 필터를 만들고 쿼리 문에서 연산자를 사용하는 방법에 대해 자세히 학습 보려면 쿼리 지정 가이드 를 참조하세요.

쿼리 에서 날짜/시간 함수를 호출하는 방법을 학습 쿼리에서 날짜/시간 함수 사용 가이드 를 참조하세요.

HQL 및 JPQL을 사용하여 쿼리를 실행 방법에 대해 자세히 학습하려면 하이버네이트 ORM 문서에서 하이버네이트 쿼리 언어 가이드 를 참조하세요.