Docs Menu
Docs Home
/ /

Realizar consultas a bases de datos nativas

En esta guía, aprenderá a usar la extensión MongoDB para Hibernate ORM para ejecutar consultas nativas en su base de datos MongoDB. En lugar de usar el lenguaje de consulta de Hibernate (HQL) o el lenguaje de consulta de persistencia de Jakarta (JPQL), las consultas nativas le permiten usar el lenguaje de consulta MongoDB (MQL) para especificar su consulta. MQL es una sintaxis de consulta diseñada para interactuar con el modelo basado en documentos de MongoDB.

Tip

Lenguaje de consulta de MongoDB

Para obtener más información sobre la sintaxis y la funcionalidad de MQL, consulte Referencia del lenguaje de consulta de MongoDB en el manual del servidor MongoDB.

ORM de Hibernate createQuery() El método no admite algunas funciones de consulta de MongoDB. El método createNativeQuery() permite especificar consultas de base de datos en MQL y evitar algunas limitaciones operativas de la extensión ORM de Hibernate.

También puede ejecutar consultas directamente en su objeto MongoClient para ampliar la funcionalidad de consulta.

Los ejemplos de esta guía utilizan la Movie entidad, que representa la sample_mflix.movies colección de los conjuntos de datos de muestra del Atlas. La Movie entidad tiene la siguiente definición:

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;
@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 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 a crear una aplicación Java que use la extensión MongoDB para Hibernate ORM para interactuar con esta colección de muestra de MongoDB, consulte Tutorial de introducción.

Nota

Contextos de Persistencia

Para habilitar que Hibernate ORM interactúe con la base de datos, debe ejecutar operaciones dentro de un contexto de persistencia utilizando una Session de Hibernate o una EntityManager de Jakarta Persistence. Los ejemplos de esta guía utilizan un Session. Para obtener más información sobre los contextos de persistencia, consulte la guía Transacciones y sesiones.

Para ejecutar una consulta nativa de MongoDB, especifique una declaración de lenguaje de consulta de MongoDB (MQL) que incluya la colección a consultar y sus criterios de consulta en una canalización de agregación.

Tip

Pipeline de agregación

Para obtener más información sobre cómo construir canales de agregación y ejecutar operaciones de agregación, consulte la referencia de canalización de agregación en el manual de MongoDB Server.

Las declaraciones MQL tienen el siguiente formato:

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

Importante

Requisitos de la etapa del proyecto

La canalización de agregación en su declaración MQL debe incluir una $project etapa. Para devolver los documentos de consulta como instancias de entidad, debe especificar cada campo de entidad, excepto el campo de clave principal, en la $project etapa.

Luego, pase la sentencia MQL al método createNativeQuery(). No puede ejecutar consultas nativas que usen valores de parámetros. En su lugar, especifique los términos de búsqueda dentro de la sentencia MQL.

Puede utilizar consultas nativas para realizar las siguientes operaciones:

Este ejemplo ejecuta una consulta nativa en la colección sample_mflix.movies pasando una instrucción MQL al método createNativeQuery(). El código especifica las siguientes etapas de la canalización de agregación:

  • $match:Filtros para documentos que tienen un valor de campo de título de "The Parent Trap"

  • $sort: Ordena los documentos coincidentes por sus campos year en orden descendente

  • $project: Devuelve cada campo de documento definido en la entidad 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

La extensión ORM de Hibernate no admite actualmente sentencias HQL ni JPQL que utilicen operadores aritméticos. Sin embargo, puede realizar operaciones aritméticas con sus datos utilizando los operadores aritméticos de MongoDB en una sentencia MQL.

Tip

Operadores aritméticos

Para obtener más información sobre los operadores aritméticos de Hibernate y MongoDB, consulte los siguientes recursos:

El siguiente ejemplo ejecuta una consulta nativa en la colección sample_mflix.movies que realiza las siguientes acciones:

  • Especifica una etapa $match para hacer coincidir documentos que tienen un valor year mayor que 2000 y un campo runtime que existe

  • Especifica una etapa $addFields para agregar un nuevo campo llamado runtimeHours

  • Utiliza el operador aritmético $divide para convertir el valor runtime de minutos a horas para el nuevo campo runtimeHours

  • Especifica una etapa $project para devolver cada campo de documento definido en la entidad Movie, excepto el campo llave primaria

  • Imprime el valor title de cada documento actualizado

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());
}
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
...

Puedes ejecutar queries nativas para realizar queries de búsqueda de MongoDB en tu base de datos, que son búsquedas de texto detalladas en tus datos. Estas consultas proporcionan funcionalidades avanzadas de búsqueda, tales como la coincidencia de frases de texto, la puntuación de resultados por relevancia y el resaltado de coincidencias.

Importante

No se puede ejecutar una consulta de búsqueda MongoDB dentro de una transacción.

Para especificar una consulta de búsqueda, cree un índice de búsqueda que cubra los campos que desea consultar. Luego, pase una canalización de agregación a su método createNativeQuery() que incluya una etapa $search o $searchMeta.

Tip

MongoDB búsqueda

Para obtener más información sobre las consultas e índices de búsqueda de MongoDB, consulte Descripción general de búsqueda de MongoDB en el manual del servidor MongoDB.

Este ejemplo ejecuta una consulta de búsqueda pasando la etapa de canalización $search al método createNativeQuery(). El código realiza las siguientes acciones:

  • Especifica el índice de búsqueda que cubre el campo plot. Asegúrese de reemplazar el marcador <indexName> con el nombre de su índice de búsqueda.

  • Consultas de documentos cuyos valores plot contienen la cadena "whirlwind romance" con no más de 3 palabras entre ellos

  • Especifica una etapa $project para devolver cada campo de documento definido en la entidad Movie, excepto el campo llave primaria

  • Imprime los valores title y plot de los documentos coincidentes

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

Si desea ejecutar operaciones de base de datos que no son compatibles con los métodos createQuery() ni createNativeQuery(), puede operar en un objeto MongoClient directamente en su aplicación Java. Al trabajar con MongoClient, puede acceder a la funcionalidad del controlador de sincronización de Java de MongoDB.

Tip

Característica Soporte

Para obtener más información sobre las funciones no compatibles de MongoDB a las que debe acceder mediante un MongoClient objeto, consulte la página Compatibilidad de funciones.

Para aprender a utilizar el controlador Java para interactuar con MongoDB, consulte la documentación del controlador Java de MongoDB.

No se puede usar la extensión ORM de Hibernate para crear índices en una colección, pero sí se puede instanciar un MongoClient y usar el método createIndex() del controlador de Java. El siguiente código crea un índice de campo title en la colección 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 obtener más información sobre cómo utilizar el driver de Java para crear índices, consulta la guía Índices en la documentación del driver de Java.

Para obtener más información sobre los lenguajes de consulta analizados en esta guía, consulte los siguientes recursos:

Volver

Especifica un query

En esta página