The general approach is:
* create an interface called the CriteriaInfoProvider which abstracts
the operations that are different for the different types of Criteria
targets.
* change the getPathEntityName method to be a factory method for
creating the proper implementation of the interface
* change the rest of CriteriaQueryTranslator to use the interface
instead of using the previous entity-only implementation
* implementations of the interface exist for
Entity: this implements the same code as currently exists
ComponentCollection: for collection-of-component
ScalarCollection: for collection-of-value
Component: for components
* update the logic in CriteriaJoinWalker which has to be very careful
about how it works since the walker walks certain property paths twice.