Tonight I pushed a new build (0.5.1) to the Maven repository. This has been a long time in coming, and consists primarily of bug fixes. (For a list of all issues fixed in this release see the Road Map).
There is one important change in the Generic DAO interface, however. We changed the signature of the search() and searchUnique() methods.
List<ENTITY_CLASS> search(Search search);
ENTITY_CLASS searchUnique(Search search);
<EXPECTED_TYPE> List<EXPECTED_TYPE> search(Search search);
<EXPECTED_TYPE> EXPECTED_TYPE searchUnique(Search search);
The old signature assumed that every search would return the root entity type, but with the Fields and result mode options on the Search, this is not always so. The old solution for this was to have two additional methods: searchGeneric and searchUniqueGeneric which returned List<?> and Object types respectively. The new approach eliminates the need for these confusing methods.
If you are unfamiliar with this sort of generic method signature, what it does is determine the return type of the method based on the context from which it is called, effectively reducing the need for explicit casting. (Here's a more in-depth description.)
For example, if we're using the RESULT_ARRAY result mode...
List<Object> results = (List<Object>) dao.searchGeneric(search);
List<Object> results = dao.search(search);
With the new method signatures, the Java compiler is able to infer from the type of the "results" variable that search() will return a list of type List<Object>. There is no longer a need to explicitly cast it in most cases.
In addition to all this, we added a new (Beta) implementation of MetadataUtil that uses JPA Annotations to determine the persistence meta model. The implication of this is that the framework should be able to be used, out of the box, with other JPA providers like OpenJPA, TopLink, etc. I hope to post more on just how to configure this when I have time.