我很高兴宣布 Hibernate OGM 4.1.0.Beta3 的发布。本版本专注于在使用 Neo4j 图形数据存储时的改进体验以及查询领域的一些改进(完整的变更日志可以在此处找到)。
与往常一样,您可以从 SourceForge 下载 发布包,或者使用 Maven、Gradle 等工具从 JBoss Nexus 仓库服务器检索 JAR 文件。GAV 坐标为
- org.hibernate.ogm:hibernate-ogm-core:4.1.0.Beta3,用于 Hibernate OGM 引擎,以及
- org.hibernate.ogm:hibernate-ogm-<datastore>:4.1.0.Beta3,具体取决于您想使用的后端。
对 Neo4j 的改进支持
现在,我们利用 Neo4j 2.x 的新特性标签,以更自然的方式映射实体。我们使用这些标签标记属于同一实体类型的所有节点。这不仅消除了对节点添加额外属性的需求,而且还可以以高效的方式查询同一实体类型的所有节点。
我们还支持执行原生 Cypher 查询。您可以通过以下方式创建它们:EntityManager#createNativeQuery()或使用实体上的@NamedNativeQuery注解
@Entity
@NamedNativeQuery(
name = "AnimalsBySpecies",
query = "MATCH ( n: Animal { species: {species} } ) RETURN n",
resultClass = Animal.class
)
public class Animal { ... }
EntityManager em = ...
List<Animal> giraffes = em.createNamedQuery( "AnimalsBySpecies", Animal.class )
.setParameter( "species", "Giraffe" )
.getResultList();
如示例所示,原生查询也支持通过原生 Cypher 参数语法使用命名参数。
目前对 Neo4j 方言的工作正在全速进行,您可以在 Beta4 版本中期待看到这一领域的进一步改进。
查询改进
在处理查询时,您现在可以利用setFirstResult()和setMaxResults()用于翻页结果集。这同样适用于JP-QL和原生MongoDB查询
EntityManager em = ...;
List<Animal> giraffes = em.createQuery( "FROM Animal WHERE species = 'Giraffe'" )
.setFirstResult( 51 )
.setMaxResults( 100 )
.getResultList();
此外,还支持ORDER BY语句在JP-QL查询中
List<Animal> giraffes = em.createQuery( "FROM Animal WHERE species = 'Giraffe' ORDER BY name DESC" )
.getResultList();
这两者结合起来,在使用Hibernate OGM在NoSQL存储上实现典型的CRUD操作(创建、读取、更新、删除)时应该非常有帮助。
接下来是什么?
对于Beta4,我们计划将JP-QL查询翻译成原生Cypher查询,用于Neo4j后端。我们还有一些性能改进的想法,并将深入研究关联到Neo4j关系的更自然映射。
MongoDB方言在查询方面也应有所改进,我们计划研究错误报告和补偿API。这将提供在无完整事务语义的存储上收集部分执行工作单元的错误的能力,以及反应这些错误的能力。
不言而喻,您的反馈对我们非常重要。因此,您可以在邮件列表上发表意见,在论坛上提问,或在问题跟踪器中报告任何错误或功能请求。