Overview
En esta guía, aprenderá a utilizar la extensión MongoDB para Hibernate ORM para ejecutar una consulta de base de datos y recuperar documentos de una colección de MongoDB.
Para consultar tus datos de MongoDB, llama al método createQuery() en una sesión o un administrador de entidades. Luego, especifica tu consulta en una instrucción de Hibernate Query Language (HQL) o Jakarta Persistence Query Language (JPQL).
Recuperar todos los documentos
Para recuperar todos los documentos de una colección, pase una instrucción SELECT al método createQuery(). En esta instrucción, especifique la entidad que representa la colección que desea consultar.
El siguiente ejemplo recupera los valores de title de todos los documentos de la colección sample_mflix.movies consultando la entidad Movie:
var allDocs = session.createQuery("select title from Movie", String.class) .getResultList(); for (var t : allDocs) { System.out.println("Title: " + t); }
var allDocs = entityManager.createQuery("select m.title from Movie m", String.class) .getResultList(); for (var t : allDocs) { System.out.println("Title: " + t); }
Recuperar documentos coincidentes
Para recuperar documentos que coincidan con criterios específicos, pase una instrucción select con una cláusula where al método createQuery(). En esta instrucción, especifica la entidad que representa la colección que deseas consultar y los criterios de coincidencia.
El siguiente ejemplo recupera documentos que tienen un valor title de "Romeo and Juliet" de la colección sample_mflix.movies:
var matchingDocs = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Romeo and Juliet") .getResultList(); for (var m : matchingDocs) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear()); }
var matchingDocs = entityManager.createQuery("select m from Movie m where m.title = :t", Movie.class) .setParameter("t", "Romeo and Juliet") .getResultList(); for (var m : matchingDocs) { System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear()); }
Retrieve One Document
Para recuperar un solo documento que coincida con criterios específicos, encadena el método getSingleResult() al método createQuery().
El siguiente ejemplo recupera un único documento que tiene un valor title de "Best in Show" de la colección sample_mflix.movies:
var singleResult = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Best in Show") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
var singleResult = entityManager.createQuery("select m from Movie m where m.title = :t", Movie.class) .setParameter("t", "Best in Show") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Importante
Errores NonUniqueResultException
Si tu query coincide con varios documentos, el método getSingleResult() genera un error NonUniqueResultException. Para evitar este error, asegúrate de que tu query coincida con un solo documento o limita los resultados de tu query a un solo documento.
Ejecutar queries de la API de criterios
En lugar de usar instrucciones HQL o JPQL para crear filtros de query, puedes utilizar la API de Criterios de Jakarta Persistence para compilar queries tipadas de manera programática.
Para crear una consulta utilizando la API de Criteria, siga los siguientes pasos:
Cree un objeto
CriteriaBuildera partir de una sesión o un gestor de entidades.Crear un objeto
CriteriaQuerydesde el generador y especificar la entidad a query.Use los métodos de consulta proporcionados por la clase
CriteriaQuerypara especificar los criterios de la consulta.
Tip
Para aprender más sobre la API Criteria, consulta Uso de la API Criteria para crear consultas en la documentación de Jakarta EE.
El siguiente ejemplo utiliza la API de Criteria para recuperar todos los documentos que tienen un valor de year igual a 1925 de la colección sample_mflix.movies:
CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery<Movie> cq = cb.createQuery(Movie.class); Root<Movie> movieRoot = cq.from(Movie.class); cq.select(movieRoot).where(cb.equal(movieRoot.get("year"), 1925)); session.createQuery(cq).getResultList() .forEach(m -> System.out.println(m.getTitle()));
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Movie> cq = cb.createQuery(Movie.class); Root<Movie> movieRoot = cq.from(Movie.class); cq.select(movieRoot).where(cb.equal(movieRoot.get("year"), 1925)); entityManager.createQuery(cq).getResultList() .forEach(m -> System.out.println(m.getTitle()));
Ejecuta consultas nativas
Para ejecutar queries de MongoDB actualmente no admitidas por la extensión de Hibernate ORM, puedes pasar tu query como una instrucción MongoDB Query Language (MQL) al método createNativeQuery().
Para aprender a ejecutar consultas nativas, consulte la guía Realizar Consultas Nativas.
Información Adicional
Para obtener más información sobre cómo realizar otras operaciones en tus datos de MongoDB, consulta la guía Realizar Operaciones CRUD.
Para aprender más sobre el uso de HQL y JPQL para ejecutar queries, consulte Una guía sobre el languaje del query de Hibernate en la documentación de Hibernate ORM.