Overview
在本指南中,您可以学习;了解如何使用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()); }
Retrieve One Document
要检索匹配特定条件的单个文档,请将 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 错误。要避免此错误,请确保查询仅匹配一个文档或查询结果限制为一个文档。
运行条件API查询
您可以使用 Jakarta Persistence Criteria API 以编程方式构建类型安全的查询,而不是使用 HQL 或 JPQL 声明创建查询筛选条件。
要使用 Criteria API创建查询,请完成以下步骤:
从会话或实体经理创建
CriteriaBuilder对象。从构建器创建一个
CriteriaQuery对象,并指定要查询的实体。使用
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 查询语言指南。