Java 8 introduces a class (java.util.Optional) that represents either a value or null. DataNucleus v5 has a requirement of Java 8, and adds support for persisting and querying fields of this type. Let’s suppose we have a class like this
public class MyClass { private Optional<String> description; ... }
By default DataNucleus will persist this as if it was of the generic type of the Optional (String in this example). Consequently on an RDBMS we will have a column in the datastore of type VARCHAR(255) NULL. If the field description represents a null then it will be persisted as NULL, otherwise as the value contained in the Optional. It supports the generic type being a normal basic type (though not a collection, map, array), or a persistable object.
JDOQL in JDO 3.2 adds support for querying the Optional field, like this
Query q = pm.newQuery( "SELECT FROM mydomain.MyClass WHERE description.isPresent()");
So this will return all instances of the class where the description field represents a value. Similarly we can return the value represented by the Optional field, like this
Query q = pm.newQuery( "SELECT description.get() FROM mydomain.MyClass");
As you can see, JDOQL makes use of standard Java method namings for accessing the Optional field.
For JPA querying, you can simply refer to the Optional field as if it was of the generic type represented.
This is part of the JDO3.2 spec and you can make use of it in DataNucleus v5+. It is not currently part of the JPA2.1 spec, but you still can make use of it in DataNucleus v5+ when using JPA.