数据库 ogm_带有Hibernate OGM的NoSQL –第二部分:查询数据

数据库 ogm

Hibernate OGM的第一个最终版本发布于 1月底,团队一直在忙于制作一系列教程式博客,使您有机会轻松地从Hibernate OGM重新开始。 第一部分是关于设置和保留您的第一个实体 。 在第二部分中,您将学习如何查询数据。 Hibernate OGM将使您以几种不同的方式获取数据:

  • 使用Java持久性查询语言(JP-QL)
  • 使用您选择的数据存储的NoSQL本机查询语言(如果有的话)
  • 使用Hibernate Search查询–主要是全文查询

所有这些替代方案将使您可以在数据存储上运行查询,并以托管实体列表的形式获取结果。

准备测试课

我们将添加一个新的类HikeQueryTest。 它将使用有关加息的一些信息填充数据存储区:

public class HikeQueryTest {private static EntityManagerFactory entityManagerFactory;@BeforeClasspublic static void setUpEntityManagerFactoryAndPopulateTheDatastore() {entityManagerFactory = Persistence.createEntityManagerFactory( "hikePu" );EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();// create a PersonPerson bob = new Person( "Bob", "McRobb" );// and two hikesHike cornwall = new Hike("Visiting Land's End", new Date(), new BigDecimal( "5.5" ),new HikeSection( "Penzance", "Mousehole" ),new HikeSection( "Mousehole", "St. Levan" ),new HikeSection( "St. Levan", "Land's End" ));Hike isleOfWight = new Hike("Exploring Carisbrooke Castle", new Date(), new BigDecimal( "7.5" ),new HikeSection( "Freshwater", "Calbourne" ),new HikeSection( "Calbourne", "Carisbrooke Castle" ));// let Bob organize the two hikescornwall.setOrganizer( bob );bob.getOrganizedHikes().add( cornwall );isleOfWight.setOrganizer( bob );bob.getOrganizedHikes().add( isleOfWight );// persist organizer (will be cascaded to hikes)entityManager.persist( bob );entityManager.getTransaction().commit();entityManager.close();}@AfterClasspublic static void closeEntityManagerFactory() {entityManagerFactory.close();}
}

此方法将确保在运行测试之前已创建实体管理器工厂,并且数据存储区包含一些数据。 这些数据与我们在第1部分中存储的数据相同。

现在我们已经有了一些数据,我们可以开始编写一些测试来搜索它们。

使用Java持久性查询语言(JP-QL)

JP-QL是一种查询语言,被定义为Java Persistence API(JPA)规范的一部分 。 它旨在与实体一起使用并且独立于数据库。

以实体远足为例:

@Entity
public class Hike {@Id@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")private String id;private String description;private Date date;private BigDecimal difficulty;@ManyToOneprivate Person organizer;@ElementCollection@OrderColumn(name = "sectionNo")private List<HikeSection> sections;// constructors, getters, setters, ...
}

JP-QL查询可获取按难度排序的可用加息列表,如下所示:

SELECT h FROM Hike h ORDER BY h.difficulty ASC

Hibernate OGM将解析此查询,并将其转换为您选择的数据存储区的本机查询语言中的等效查询。 例如,在Neo4j中,它创建并执行如下所示的Cypher查询:

MATCH (h:Hike) RETURN h ORDER BY h.difficulty

在MongoDB中,使用MongoDB JavaScript API作为查询符号,它看起来像这样:

db.Hike.find({}, { "difficulty": 1})

如果在应用程序中使用JP-QL,则无需更新查询就可以在数据存储区之间切换。

现在您已经了解了所发生的情况,我们可以开始查询持久化的数据。 例如,我们可以获取可用加息的列表:

@Testpublic void canSearchUsingJPQLQuery() {// Get a new entityManagerEntityManager entityManager = entityManagerFactory.createEntityManager();// Start transactionentityManager.getTransaction().begin();// Find all the available hikes ordered by difficultyList<Hike> hikes = entityManager.createQuery( "SELECT h FROM Hike h ORDER BY h.difficulty ASC" , Hike.class ).getResultList();assertThat( hikes.size() ).isEqualTo( 2 );assertThat( hikes ).onProperty( "description" ).containsExactly( "Visiting Land's End", "Exploring Carisbrooke Castle" );entityManager.getTransaction().commit();entityManager.close();}

如果您曾经使用过JPA规范,就会发现此代码非常熟悉:这与使用JPA处理关系数据库时所编写的代码相同。

您可以通过在Neo4j和MongoDB之间切换配置和依赖项来进行测试:测试仍将通过而无需更改代码。

很棒的事情是,您可以对没有自己的查询引擎的数据存储使用JP-QL查询。 在这种情况下,Hibernate OGM的查询解析器将创建全文查询,这些查询通过Hibernate Search和Lucene执行。 稍后我们将详细介绍如何执行此操作。

查询的结果是被管理实体的列表。 这意味着对对象的更改将自动应用于数据库中的数据。 您还可以浏览结果对象图,从而根据需要加载惰性关联。

JP-QL语言的支持不完整,并且可能会因后端而异。 我们将把细节留给Hibernate OGM的官方文档。 目前支持的是:

  • 简单比较
  • IS NULLIS NOT NULL
  • 布尔运算符ANDORNOT
  • LIKE,INBETWEEN
  • 订购

如果JP-QL不适用于您的用例,我们将了解如何使用所选后端的本机语言执行查询。

使用本机后端查询语言

有时,您可能决定牺牲可移植性,而使用基础本机查询语言的功能。 例如,您可能想从Neo4j的Cypher语言的功能中受益,以运行分层/递归查询。 使用MongoDB,让我们通过“ Penzance”进行加息:

// Search for the hikes with a section that start from "Penzace" in MongoDB
List<Hike> hikes = entityManager.createNativeQuery("{ $query : { sections : { $elemMatch : { start: 'Penzance' } } } }", Hike.class ).getResultList();

Neo4j的相同代码如下所示:

// Search for the hikes with a section that start from "Penzace" in Neo4j
List<Hike> hikes = entityManager.createNativeQuery( "MATCH (h:Hike) -- (:Hike_sections {start: 'Penzance'} ) RETURN h", 
Hike.class ).getResultList();

需要注意的重要一点是,与JPA查询一样,查询返回的对象是托管实体。

您还可以使用注释javax.persistence.NamedNativeQuery定义查询:

@Entity
@NamedNativeQuery(
name = "PenzanceHikes",
query = "{ $query : { sections : { $elemMatch : { start: 'Penzance' } } } }", resultClass = Hike.class )
public class Hike { ... }

然后像这样执行它:

List<Hike> hikes = entityManager.createNamedQuery( "PenzanceHikes" ).getResultList();

使用Hibernate Search查询

Hibernate Search提供了一种将Java对象索引到Lucene索引中并对其执行全文查询的方法。 索引确实位于数据存储区之外。 这意味着即使本机不支持查询功能,也可以具有查询功能。 它还在功能集和可伸缩性方面提供了一些有趣的属性。 特别是,使用Hibernate Search,您可以减轻查询执行的负担,以分离节点并独立于实际的数据存储节点扩展其规模。

在此示例中,我们将使用MongoDB。 您首先需要将Hibernate Search添加到您的应用程序。 在Maven项目中,您需要在pom.xml中添加以下依赖项:

<dependencies>...<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-search-orm</artifactId></dependency>...
</dependencies>

现在,您可以选择要索引的内容:

@Entity
@Indexed
public class Hike {@Id@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")private String id;@Fieldprivate String description;private Date date;private BigDecimal difficulty;@ManyToOneprivate Person organizer;@ElementCollection@OrderColumn(name = "sectionNo")private List<HikeSection> sections;// constructors, getters, setters, ...
}

@Indexed批注标识我们要索引的类,而@Field批注指定我们要索引的类的属性。 每当使用Hibernate OGM通过实体管理器保留新的Hike实体时,Hibernate Search都会自动将其添加到索引中并跟踪对托管实体的更改。 这样,索引和数据存储就可以保持最新状态。

现在,您可以使用Lucene查询来寻找Carisbrooke的远足。 在此示例中,我们将使用Hibernate Search提供的查询构建器:

@Test
public void canSearchUsingFullTextQuery() {EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();//Add full-text superpowers to any EntityManager:FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManager);// Optionally use the QueryBuilder to simplify Query definition:QueryBuilder b = ftem.getSearchFactory().buildQueryBuilder().forEntity( Hike.class ).get();// A Lucene query to search for hikes to the Carisbrooke castle:Query lq = b.keyword().onField("description").matching("Carisbrooke castle").createQuery();//Transform the Lucene Query in a JPA Query:FullTextQuery ftQuery = ftem.createFullTextQuery(lq, Hike.class);//This is a requirement when using Hibernate OGM instead of ORM:ftQuery.initializeObjectsWith( ObjectLookupMethod.SKIP, DatabaseRetrievalMethod.FIND_BY_ID );// List matching hikesList<Hike> hikes = ftQuery.getResultList();assertThat( hikes ).onProperty( "description" ).containsOnly( "Exploring Carisbrooke Castle" );entityManager.getTransaction().commit();entityManager.close();
}

代码的结果将是描述中提到“ Carisbrooke城堡”的远足清单。

Hibernate Search是一个非常强大的工具,具有许多不同的选项,在本教程中描述所有这些选项都将花费很长时间。 您可以查看参考文档以了解更多信息。

结语

目前为止就这样了。 如您所见,Hibernate OGM为您提供了一系列选项来对数据存储区运行查询,这些选项应满足您大多数典型的查询需求:JP-QL,本机NoSQL查询和通过Hibernate Search / Apache Lucene进行的全文查询。 即使您以前从未使用过NoSQL数据存储区,也可以轻松地对其进行试验。

您可以在GitHub上找到此博客文章(以及上一篇)的完整示例代码 。 只需叉子,然后随心所欲地玩就可以了。

既然您知道如何存储和查找实体,我们将在本系列的下一部分中看到如何将所有内容放入应用程序容器(如WildFly)中 。

我们渴望了解您的意见,随时发表评论或与我们联系 ,我们将回答您的问题并听到您的反馈。

感谢Gunnar Morling( @gunnarmorling )和Davide D'Alto(@Github: DavidD )创建了本教程。

翻译自: https://www.javacodegeeks.com/2015/02/nosql-hibernate-ogm-part-two-querying-data.html

数据库 ogm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索

龙源期刊网 http://doc.wendoc.com计算机网络技术专业教学模式改革探索作者&#xff1a;魏学宏来源&#xff1a;《职业中旬》2014年第12期摘要&#xff1a;中职教育是培养应用型技术人才的教育。为实现培养目标&#xff0c;推动教学方法改革&#xff0c;笔者在计算机网络技术专…

osgi:install_OSGi服务测试助手:ServiceCollector

osgi:installOSGi服务对于基于松散耦合组件的系统开发非常有用。 但是&#xff0c;松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此&#xff0c;我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板&#xff0c;我编写了一个简单的实…

塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...

首先还是祝各位Jumper圣诞快乐&#xff01;业界新闻1. 各大厂商新年寄语&#xff0c;表明未来动向Fami通收到了54家日厂的新年贺卡&#xff0c;其中表明了相当多的新游戏和企划&#xff0c;具体如下&#xff1a;Atlus &#xff1a;《真女神转生V》和《PROJECT Re FANTASY》正在…

PHP 社区拒绝在俄乌冲突中“站队”

点击上方蓝字关注我&#xff0c;了解更多咨询几天前&#xff0c;PHP 社区邮件讨论列表出现了一封“申请援助乌克兰”的邮件&#xff0c;该邮件由非 PHP 开发者发起&#xff0c;目的在于呼吁 PHP 社区火速参与俄乌冲突...邮件机翻译文如下&#xff1a;有意思的是&#xff0c;非 …

放置奇兵最新服务器,放置奇兵开服表

游戏简介&#xff1a;《放置奇兵》是一款全球顶级奇幻RPG手游&#xff0c;派出你的英雄小队&#xff0c;出 发&#xff0c;从碧绿葱葱的萨拉森林到神圣威严的至高天&#xff0c;同数百万玩家一同踏上魔幻旅程&#xff0c;带领你的英雄小队深入古老的废墟&#xff0c;对抗邪恶的…

如何把svn代码拉下来,Maven - 从SVN拉取代码

I am migrating J2ee Project from Ant to Maven,One of The ant tasks is to pull existing source from SVN RepositoryCompile it, and add its jar to my current build as JarIs it possible to do the get the source and compile it in Maven?Thank you!解决方案Yes, i…

jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究支持案例的方式&#xff0c;将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用情…

为什么说PHP是很糟糕的,也是很好的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时&#xff0c;他们并没有说错。这门语言确实有很多不好的地方。搁在以前&#xff0c;这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP…

中南大学计算机博士读几年,法学院2019年上半年毕业博士生须知

为保证2019年上半年博士生毕业工作顺利开展&#xff0c;根据我校博士生答辩管理的相关文件&#xff0c;现将有关事项通知如下&#xff0c;请遵照执行。1.毕业申请:拟毕业研究生于3月15日前登录“中南大学研究生教育管理信息系统”(以下简称管理系统)&#xff0c;在管理系统个人…

1.0jpa 2.0_JPA 2.1:不同步的持久性上下文

1.0jpa 2.0JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API &#xff0c;它表示操纵一个资源的组件&#xff08;例如&#xff0c;使用其JDBC驱动程序操纵的具体数据库&#xff09;。 默认情况下&…

vue 保存时清空iuput_vue清空input file

Coding源码学习第四部分&lpar;Masonry介绍与使用&lpar;三&rpar;&rpar;接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...python 线性回归示例说明:此文的第一部分参考了这里 用python进…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

@namedqueries_在@NamedQueries中枚举@NamedQuery

namedqueries介绍 如果您是使用JPA的Java开发人员&#xff0c;则很可能在实体上声明了一个或多个NamedQuery对象。 要在类上声明NamedQuery &#xff0c;必须在类中简单地用查询名称及其JPQL进行注释&#xff0c;例如&#xff1a; Entity NamedQuery(name "findAllProj…

ue4 设置intellisence_UE4.22编辑器界面操控设置(4)

视频课程地址&#xff1a;https://i.youku.com/i/UMzE2NDk2OTIw/custom?spma2hzp.8244740.0.0&id32318-在场景中按住鼠标左键上下移动鼠标&#xff0c;摄像机可以在场景中前后移动&#xff0c;左右移动鼠标&#xff0c;在场景中视角会左右旋转。-在场景中按住鼠标右键&…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

天刀服务器维护时间,6月3日服务器例行维护公告(已完成)

一、重要更新天地风云联赛1、摧毁敌方天芒之塔后除了给本方少侠增加一层士气之外&#xff0c;还会给本方少侠增加一层攻击增益和防御增益。2、击败敌方护卫弓箭手不会给本方少侠增加士气。3、无双之影登场时间提前&#xff1a;比赛还剩15分钟无双之影第一次登场&#xff0c;比赛…

python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...

1.2 解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时&#xff0c;会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来&#xff1f;解决方案Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程…