Docs Menu
Docs Home
/ /

네이티브 데이터베이스 쿼리 수행

In this guide, you can learn how to use the MongoDB Extension for Hibernate ORM to run native queries on your MongoDB database. Instead of Hibernate Query Language (HQL) or Jakarta Persistence Query Language (JPQL), native queries allow you to use MongoDB Query Language (MQL) to specify your query. MQL is a query syntax designed for interacting with MongoDB's document-based model.

MongoDB 쿼리 언어

MQL의 구문 및 기능에 대해 자세히 학습 MongoDB Server 매뉴얼의 MongoDB 쿼리 언어 참조를 참조하세요.

최대 절전 모드 ORM의 createQuery() 메서드는 일부 MongoDB 쿼리 기능을 지원 하지 않습니다. createNativeQuery() 메서드를 사용하면 MQL 에서 데이터베이스 쿼리를 지정하고 하이버네이트 ORM 확장의 일부 운영 제한 사항을 우회할 수 있습니다.

확장된 쿼리 기능을 위해 MongoClient 객체 에서 직접 쿼리를 실행 수도 있습니다.

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

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
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 int runtime;
private String[] cast;
public Movie(String title, String plot, int year, int runtime, String[] cast) {
this.title = title;
this.plot = plot;
this.year = year;
this.runtime = runtime;
this.cast = cast;
}
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 int getRuntime() {
return runtime;
}
public void setRuntime(int runtime) {
this.runtime = runtime;
}
public String[] getCast() {
return cast;
}
public void setCast(String[] cast) {
this.cast = cast;
}
}

To learn how to create a Java application that uses the MongoDB Extension for Hibernate ORM to interact with this MongoDB sample collection, see the Get Started tutorial.

참고

지속성 컨텍스트

하이버네이트 ORM이 데이터베이스 와 상호 작용 활성화 하려면 하이버네이트 Session 또는 자카르타 퍼시스턴스 를 사용하여 퍼시스턴스 컨텍스트 내에서 작업을 실행 해야 EntityManager 합니다. 이 가이드 의 예제에서는 를 사용합니다.Session 지속성 컨텍스트에 대해 자세히 학습 트랜잭션 및 세션 가이드 참조하세요.

네이티브 MongoDB 쿼리 실행 하려면 집계 파이프라인 에서 쿼리 할 컬렉션 과 쿼리 기준을 포함하는 MQL ( MongoDB Query Language) 성명서 지정합니다.

집계 파이프라인

집계 라인 구성 및 집계 작업 실행 에 대한 자세한 학습 MongoDB Server 매뉴얼의 집계 파이프라인 참조를 참조하세요.

MQL 문의 형식은 다음과 같습니다.

String mqlSyntax = """
{
aggregate: "<collection to query>",
pipeline: [
<aggregation pipeline stages>
]
}
""";

중요

$ 프로젝트 단계 요구 사항

MQL 성명서 집계 파이프라인 에는 $project 단계가 포함되어야 합니다. 쿼리 문서를 엔터티 인스턴스로 반환하려면 단계에서 기본 키 필드 이외의 각 엔터티 필드 $project 지정해야 합니다.

그런 다음 MQL 성명서 createNativeQuery() 메서드에 전달합니다. 매개변수 값을 사용하는 네이티브 쿼리는 실행 수 없습니다. 대신 MQL 성명서 내에 검색 를 지정합니다.

네이티브 쿼리를 사용하여 다음 작업을 수행할 수 있습니다.

이 예시 createNativeQuery() 메서드에 MQL 성명서 전달하여 sample_mflix.movies 컬렉션 에 대한 네이티브 쿼리 실행합니다. 이 코드는 다음 집계 파이프라인 단계 지정합니다.

  • $match: 제목 필드 값이 다음과 같은 문서를 필터링합니다. "The Parent Trap"

  • $sort: 일치하는 문서를 year 필드를 기준으로 내림차순으로 정렬합니다.

  • $project: Movie 엔터티에 정의된 각 문서 필드 반환합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { title: { $eq: "The Parent Trap" } } },
{ $sort: { year: -1 } },
{ $project: { title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } }
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie movie : results) {
System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear());
}
Title: The Parent Trap, Year: 1998
Title: The Parent Trap, Year: 1961

하이버네이트 ORM 확장은 현재 산술 연산자를 사용하는 HQL 또는 JPQL 문을 지원 하지 않습니다. 그러나 MQL 성명서 에서 MongoDB의 산술 연산자를 사용하여 데이터에 산술 연산을 수행할 수 있습니다.

산술 연산자

최대 절전 모드 및 MongoDB 산술 연산자에 대해 자세히 학습 다음 리소스를 참조하세요.

다음 예시 sample_mflix.movies 컬렉션 에서 다음 조치를 수행하는 네이티브 쿼리 실행합니다.

  • year 값이 2000 보다 크고 runtime 필드 존재하는 문서와 일치하는 $match 단계를 지정합니다.

  • runtimeHours이라는 새 필드 추가하는 $addFields 단계를 지정합니다.

  • $divide 산술 연산자 사용하여 새 runtimeHours 필드 의 runtime 값을 분에서 시간으로 변환합니다.

  • 기본 키 필드 이외의 Movie 엔터티에 정의된 각 문서 필드 반환하는 $project 단계를 지정합니다.

  • 업데이트된 각 문서 의 title 값을 출력합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { year: { $gt: 2000 }, runtime: { $exists: true } } },
{ $addFields: {
runtimeHours: { $divide: [ "$runtime", 60 ] }
}},
{ $project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1
}}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Added field to movie: " + result.getTitle());
}
Added field to movie: Kate & Leopold
Added field to movie: Crime and Punishment
Added field to movie: Glitter
Added field to movie: The Manson Family
Added field to movie: The Dancer Upstairs
Added field to movie: Fantastic Four
...

네이티브 쿼리를 실행 데이터베이스 에서 데이터에 대한 세분화된 텍스트 검색인 MongoDB Search 쿼리를 수행할 수 있습니다. 이러한 쿼리는 텍스트 구문 일치, 관련성에 대한 결과 채점, 일치 항목 강조 표시 등의 고급 검색 기능을 제공합니다.

중요

트랜잭션 내에서는 MongoDB Search 쿼리 실행 수 없습니다.

검색 쿼리 지정하려면 쿼리 하려는 필드를 포함하는 검색 인덱스 만듭니다. 그런 다음 $search 또는 $searchMeta 단계가 포함된 createNativeQuery() 메서드에 집계 파이프라인 전달합니다.

MongoDB Search

MongoDB Search 쿼리 및 인덱스에 대해 자세히 학습 MongoDB Server 매뉴얼의 MongoDB Search 개요를 참조하세요.

이 예시 $search 파이프라인 단계를 createNativeQuery() 메서드에 전달하여 검색 쿼리 실행합니다. 이 코드는 다음 조치를 수행합니다.

  • plot 필드 포함하는 검색 인덱스 지정합니다. <indexName> 자리 표시자를 검색 인덱스 이름으로 바꿔야 합니다.

  • plot 값 사이에 3 단어 이하의 "whirlwind romance" 문자열이 포함된 문서를 쿼리합니다.

  • 기본 키 필드 이외의 Movie 엔터티에 정의된 각 문서 필드 반환하는 $project 단계를 지정합니다.

  • 일치하는 문서의 titleplot 값을 출력합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{
$search: {
index: "<indexName>",
phrase: {
path: "plot",
query: "whirlwind romance",
slop: 3
}
}
},
{
$project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1
}
}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Title: " + result.getTitle() + ", Plot: " + result.getPlot());
}
Title: Tokyo Fiancèe, Plot: A young Japanophile Belgian woman in Tokyo falls into a whirlwind romance with a Francophile Japanese student.
Title: Designing Woman, Plot: A sportswriter and a fashion-designer marry after a whirlwind romance, and discover they have little in common.
Title: Vivacious Lady, Plot: On a quick trip to the city, young university professor Peter Morgan falls in love with nightclub performer Francey Brent and marries her after a whirlwind romance. But when he goes back ...
Title: Ek Hasina Thi, Plot: A woman falls for a charming and mysterious businessman. The whirlwind romance turns sour when she is framed for his underworld crimes. Now, finally out of prison she is ready for sweet revenge.
Title: Kick, Plot: An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.
Title: A Tale of Winter, Plot: Felicie and Charles have a serious if whirlwind holiday romance. Due to a mix-up on addresses they lose contact, and five years later at Christmas-time Felicie is living with her mother in ...

createQuery() 메서드와 createNativeQuery() 메서드가 모두 지원하지 않는 데이터베이스 작업을 실행 하려는 경우 Java 애플리케이션 에서 직접 MongoClient 객체 에 대해 작업할 수 있습니다. MongoClient으로 작업할 때 MongoDB Java 동기화 드라이버의 기능에 액세스 할 수 있습니다.

기능 지원

객체 사용하여 액세스 해야 하는 지원되지 않는 MongoDB 기능에 MongoClient 대해 자세히 학습 최대 절전 모드 ORM 기능 호환성 페이지를 참조하세요.

Java 운전자 사용하여 MongoDB 와 상호 작용 방법을 학습 MongoDB Java 드라이버 설명서를 참조하세요.

하이버네이트 ORM 확장을 사용하여 컬렉션 에 인덱스를 생성할 수는 없지만 MongoClient 를 인스턴스화하고 Java 드라이버의 createIndex() 메서드를 사용할 수 있습니다. 다음 코드는 sample_mflix.movies 컬렉션 에 title 필드 인덱스 생성합니다.

// Replace the <connection URI> placeholder with your MongoDB connection URI
String uri = "<connection URI>";
MongoClient mongoClient = MongoClients.create(uri);
MongoDatabase db = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> collection = db.getCollection("movies");
String indexResult = collection.createIndex(Indexes.ascending("title"));
System.out.println(String.format("Index created: %s", indexResult));
Index created: title_1

Java 운전자 사용하여 인덱스를 생성하는 방법에 대해 자세히 학습 Java 운전자 설명서의 인덱스 가이드 참조하세요.

이 가이드 에서 설명하는 쿼리 언어에 대해 자세히 학습 다음 리소스를 참조하세요.

돌아가기

쿼리 지정

이 페이지의 내용