It's my great pleasure to announce the release of Hibernate OGM 4.1.0.Beta3. This release is focused on an improved experience when working with the Neo4j graph datastore and several improvements in the field of querying (the complete change log can be found here).3 for the Hibernate OGM engine and
- org.hibernate.ogm:hibernate-ogm-<datastore>:4.1.0.Beta3, depending on the backend you want to use.
Improved support for Neo4j
We now take advantage of labels - a new feature of Neo4J 2.x - to map entities in a more natural way. We use these labels to tag all the nodes belonging to one entity type. This does not only remove the need to put additional properties to the nodes but also will allow us to query for all the nodes of one entity type in an efficient manner.
We also support the execution of native Cypher queries now. You can either create them ad-hoc via EntityManager#createNativeQuery() or using the @NamedNativeQuery annotation on your entities:
@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();
As you can see in the example, native queries for Neo4j also support named parameters via the native Cypher parameter syntax.
The work on the Neo4j dialect is in full swing these days and you can expect to see further improvements in this field in the Beta4 release.
Query improvements
When working with queries you can now make use of setFirstResult() and setMaxResults() to page through a result set. This works for JP-QL as well as native MongoDB queries:
EntityManager em = ...; List<Animal> giraffes = em.createQuery( "FROM Animal WHERE species = 'Giraffe'" ) .setFirstResult( 51 ) .setMaxResults( 100 ) .getResultList();
Furthermore there is support for ORDER BY clauses in JP-QL queries now:
List<Animal> giraffes = em.createQuery( "FROM Animal WHERE species = 'Giraffe' ORDER BY name DESC" ) .getResultList();
These two things together should be of great help when using Hibernate OGM to implement typical CRUD use cases (create, read, update, delete) on top of your NoSQL store.
What's next?
For Beta4 we plan to translate JP-QL queries into native Cypher queries for the Neo4j backend. We also got some ideas for performance improvements and will take a look into a more natural mapping of assocations to Neo4j relationships.
The MongoDB dialect should see some improvements around querying as well and we plan on investigating an error report and compensation API. This will offer the ability to collect errors on partially executed units of work on stores without full transactional semantics and the ability to react to these errors.
Needless to say, your feedback matters very much to us. So you're very welcome to raise your voice on the mailing list, ask questions in the forum or report any bugs or feature requests in the issue tracker.