Menu Docs
Página inicial do Docs
/ /

Executar queries de banco de dados nativas

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.

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;
@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.

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.

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

Para saber mais sobre a construção de pipelines de agregação e a execução de operações de agregação , consulte a referência do aggregation pipeline 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 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:

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 seus year campos em ordem decrescente

  • $project: retorna cada campo de documento definido na entidade 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

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:

O exemplo a seguir executa uma query nativa na collection sample_mflix.movies que executa as seguintes ações:

  • Especifica um estágio $match para corresponder a documentos que têm um valor de year maior que 2000 e um campo runtime que existe

  • Especifica um estágio $addFields para adicionar um novo campo chamado runtimeHours

  • Utiliza o operador aritmético $divide para converter o valor runtime de minutos para horas para o novo campo runtimeHours

  • Especifica um estágio $project para retornar cada campo de documento definido na entidade Movie, diferente do campo de chave primária

  • Imprime o valor title de 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
...

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 plot contêm a string "whirlwind romance" com não mais de 3 palavras entre eles

  • Especifica um estágio $project para retornar cada campo de documento definido na entidade Movie, diferente do campo de chave primária

  • Imprime os valores title e plot dos 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 ...

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 .

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 .

Para saber mais sobre as linguagens de query discutidas neste guia, consulte os seguintes recursos:

Voltar

Especificar uma query

Nesta página