对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

查找文档

在本指南中,您可以学习;了解如何使用MongoDB Extension for Hibernate ORM运行数据库查询,以从MongoDB集合中检索文档。

要查询MongoDB数据,请在会话或实体管理器上调用 createQuery() 方法。然后,以 Hibernate Query Language (HQL) 或 Jakarta Persistence Query Language (JPQL)声明指定您的查询。

要从集合中检索所有文档,请将 select声明传递给 createQuery() 方法。在此声明中,指定表示要查询的集合的实体。

The following example retrieves the title values of all documents from the sample_mflix.movies collection by querying the Movie entity:

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

要检索匹配特定条件的文档,请将带有 where 子句的 SELECT声明传递给 createQuery() 方法。在此声明中,指定表示要查询的集合的实体以及匹配条件。

The following example retrieves documents that have a title value of "Romeo and Juliet" from the sample_mflix.movies collection:

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

要检索匹配特定条件的单个文档,请将 getSingleResult() 方法链接到 createQuery() 方法。

The following example retrieves a single document that has a title value of "Best in Show" from the sample_mflix.movies collection:

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

重要

NonUniqueResultException 错误

如果查询匹配多个文档,则 getSingleResult() 方法会引发 NonUniqueResultException 错误。要避免此错误,请确保查询仅匹配一个文档或查询结果限制为一个文档。

您可以使用 Jakarta Persistence Criteria API 以编程方式构建类型安全的查询,而不是使用 HQL 或 JPQL 声明创建查询筛选条件。

要使用 Criteria API创建查询,请完成以下步骤:

  1. 从会话或实体经理创建 CriteriaBuilder对象。

  2. 从构建器创建一个 CriteriaQuery对象,并指定要查询的实体。

  3. 使用 CriteriaQuery 类提供的查询方法来指定查询条件。

提示

要学习;了解有关 Criteria API 的更多信息,请参阅 Jakarta EE 文档中的使用 Criteria API创建查询。

The following example uses the Criteria API to retrieve all documents that have a year value of 1925 from the sample_mflix.movies collection:

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

要运行Hibernate ORM 扩展当前不支持的MongoDB查询,您可以将查询作为MongoDB查询语言 (MQL)声明传递给 createNativeQuery() 方法。

要学习了解如何运行原生查询,请参阅执行原生查询指南。

要了解有关对MongoDB数据执行其他操作的更多信息,请参阅CRUD 操作指南。

要了解有关使用 HQL 和 JPQL 运行查询的更多信息,请参阅 Hibernate ORM 文档中的 Hibernate 查询语言指南。