Visão geral
Neste guia, você pode aprender a usar a extensão MongoDB para Hibernate ORM para executar queries nativas em seu banco de dados MongoDB. Em vez da linguagem de query do Hibernate (HQL) ou da linguagem de query de persistência do Jakarta (JPQL), as queries nativas permitem que você use a linguagem de query do MongoDB (MQL) para especificar sua query. MQL é uma sintaxe de query projetada para interação com o modelo baseado em documentos do MongoDB.
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 Hibernate ORM não suporta alguns recursos de query 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
The examples in this guide use the Movie entity, which represents the sample_mflix.movies collection from the Atlas sample datasets. The Movie entity has the following definition:
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import java.util.List; 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 List<String> cast; public Movie(String title, String plot, int year, int runtime, List<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 List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } }
Para aprender como criar um aplicativo Java que use a Extensão MongoDB para Hibernate ORM para interagir com essa coleção de amostras do MongoDB, veja o tutorial Get Started.
Observação
Contextos de persistência
Para habilitar o ORM do Hibernate para interagir com o banco de dados, você deve executar operações dentro de um contexto de persistência utilizando um Hibernate Session ou um Jakarta Persistence EntityManager. Os exemplos neste guia usam um Session. Para saber mais sobre contextos de persistência, consulte o Transações e Sessões guia.
Executar queries nativas
Para executar uma query nativa do MongoDB, especifique uma declaração de linguagem de query do MongoDB (MQL) que inclua a coleção a ser consultada e seus critérios de query em um pipeline de agregação.
Dica
Pipeline de agregação
Para saber mais sobre a construção de pipeline de agregação e a execução de operações de agregação, consulte a referência do pipeline de agregação no manual do MongoDB Server.
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 agregação pipeline 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:
Filtro e classificar campos de documento
Este exemplo executa uma query nativa na coleção sample_mflix.movies passando uma declaração MQL para o método createNativeQuery(). O código especifica as seguintes fases 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()); }
Usar operadores aritméticos
A extensão ORM do Hibernate 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 Hibernate e do MongoDB, consulte os seguintes recursos:
Aritmética numérica no guia de query do Hibernate ORM
Operadores aritméticos no manual do MongoDB Server
O exemplo a seguir executa uma query nativa na coleção 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, runtimeHours: 1 }} ] } """; var results = session.createNativeQuery(nativeQuery, Movie.class) .getResultList(); for (Movie result : results) { System.out.println("Added field to movie: " + result.getTitle()); }
Executar uma query de pesquisa do MongoDB
Você pode executar queries nativas para realizar queries de pesquisa do MongoDB 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 de pesquisa 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 atlas-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()); }
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 aplicativo 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 objeto MongoClient para acessar, consulte a página Compatibilidade de funcionalidades.
Para aprender como usar o driver Java para a interação 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));
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