Visão geral
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.
Dica
Linguagem de query do MongoDB
Para saber mais sobre a sintaxe e a funcionalidade do MQL, consulte Referência da linguagem de query do MongoDB no manual do MongoDB Server .
O método createQuery() do Hibernar ORM não suporta alguns recursos de consulta MongoDB . O método createNativeQuery() permite especificar queries de banco de dados no MQL e ignorar algumas limitações operacionais da extensão ORM do Hibernar.
Você também pode executar queries diretamente no seu objeto MongoClient para expandir a funcionalidade de query.
Dados de amostra
Os exemplos neste guia usam a Movie entidade, que representa a sample_mflix.movies coleção dos conjuntos de dados de amostra do Atlas. A Movie entidade tem a seguinte definição:
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; public class Movie { 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.
Observação
Contextos de persistência
Para habilitar o ORM do Hibernar para interagir com o banco de dados, você deve executar operações dentro de um contexto de persistência utilizando um Hibername Session ou um Jakarta EntityManager Persistence. Os exemplos neste guia usam Session um. Para saber mais sobre contextos de persistência, consulte o guia Transações e Sessões.
Executar queries nativas
Para executar uma query nativa do MongoDB , especifique uma declaração de linguagem de query do MongoDB (MQL) que inclua a collection a ser consultada e seus critérios de query em um pipeline de agregação .
Dica
Pipeline de agregação
As declarações MQL têm o seguinte formato:
String mqlSyntax = """ { aggregate: "<collection to query>", pipeline: [ <aggregation pipeline stages> ] } """;
Importante
$ Requisitos de estágio do projeto
O pipeline de agregação em sua declaração MQL deve incluir um estágio. Para retornar os documentos de query como instâncias de entidade, você deve especificar cada campo de entidade diferente do campo de chave primária $project no $project estágio.
Em seguida, passe a declaração MQL para o método createNativeQuery(). Você não pode executar queries nativas que usam valores de parâmetro. Em vez disso, especifique seus termos de pesquisa na declaração MQL .
Você pode usar queries nativas para executar as seguintes operações:
Filtrar e classificar campos de documento
Este exemplo executa uma query nativa na collection sample_mflix.movies passando uma instrução MQL para o método createNativeQuery(). O código especifica os seguintes estágios do pipeline de agregação :
$match: Filtros para documentos que têm um valor de campo de título de"The Parent Trap"$sort: classifica os documentos correspondentes por seusyearcampos em ordem decrescente$project: retorna cada campo de documento definido na entidadeMovie
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
Usar operadores aritméticos
A extensão ORM do Hibernar não suporta atualmente declarações HQL ou JPQL que usam operadores aritméticos. No entanto, você pode executar operações aritméticas em seus dados usando os operadores aritméticos do MongoDB em uma declaração MQL .
Dica
Operadores aritméticos
Para saber mais sobre os operadores aritméticos do Hibername e do MongoDB , consulte os seguintes recursos:
Numeric arithmetic in the Hibernate ORM query guide
Operadores aritméticos no manual do MongoDB Server
O exemplo a seguir executa uma query nativa na collection sample_mflix.movies que executa as seguintes ações:
Especifica um estágio
$matchpara corresponder a documentos que têm um valor deyearmaior que2000e um camporuntimeque existeEspecifica um estágio
$addFieldspara adicionar um novo campo chamadoruntimeHoursUtiliza o operador aritmético
$dividepara converter o valorruntimede minutos para horas para o novo camporuntimeHoursEspecifica um estágio
$projectpara retornar cada campo de documento definido na entidadeMovie, diferente do campo de chave primáriaImprime o valor
titlede cada documento atualizado
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 ...
Executar uma query de pesquisa do MongoDB
Você pode executar queries nativas para realizar queries do MongoDB Search em seu banco de dados, que são pesquisas de texto refinadas em seus dados. Essas queries oferecem funcionalidade de pesquisa avançada, como correspondência de frases de texto, pontuação de resultados por relevância e realce de correspondências.
Importante
Você não pode executar uma query do MongoDB Search dentro de uma transação.
Para especificar uma query de pesquisa, crie um índice de pesquisa que abranja os campos em que você deseja fazer query. Em seguida, passe um pipeline de agregação para seu método createNativeQuery() que inclua um estágio $search ou $searchMeta.
Dica
MongoDB Search
Para saber mais sobre queries e índices do MongoDB Search, consulte Visão geral do MongoDB Search no manual do MongoDB Server .
Este exemplo executa uma query de pesquisa passando o estágio de pipeline $search para o método createNativeQuery(). O código executa as seguintes ações:
Especifica o índice de pesquisa que cobre o campo
plot. Certifique-se de substituir o espaço reservado<indexName>pelo seu nome de índice de pesquisa.Queries de documentos cujos valores
plotcontêm a string"whirlwind romance"com não mais de3palavras entre elesEspecifica um estágio
$projectpara retornar cada campo de documento definido na entidadeMovie, diferente do campo de chave primáriaImprime os valores
titleeplotdos documentos correspondentes
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 ...
Executar operações do MongoClient
Se quiser executar operações de banco de dados que nem o método createQuery() nem o método createNativeQuery() suportem, você pode operar em um objeto MongoClient diretamente no seu aplicação Java . Ao trabalhar com o MongoClient, você pode acessar a funcionalidade do MongoDB Java Sync Driver.
Dica
Suporte a recursos
Para saber mais sobre as funcionalidades do MongoDB não suportadas que você deve usar um MongoClient objeto para acessar, consulte a página Compatibilidade de funcionalidades do ORM do Hibername.
Para saber como usar o driver Java para interagir com o MongoDB , consulte a documentação do driver Java do MongoDB .
Crie índices com o MongoClient
Você não pode usar a extensão ORM do Hibernar para criar índices em uma coleção, mas pode instanciar um MongoClient e usar o método createIndex() do driver Java . O seguinte código cria um índice de campo title na coleção sample_mflix.movies:
// 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
Para saber mais sobre como usar o driver Java para criar índices, consulte o guia Índices na documentação do driver Java .
Informações adicionais
Para saber mais sobre as linguagens de query discutidas neste guia, consulte os seguintes recursos:
Um guia para a linguagem de query do Hibernar na documentação do ORM do Hibernado
Referência da linguagem de query do MongoDB no manual do MongoDB Server