My $.02:
1) HQL is very nice and pretty compact. Definately set up a small tester app where you can quickly paste in HQL strings you are trying out to make sure they are syntactically and loggically correct. Once you know the string is correct, make it a named query so that it loads and compiles at app startup. This way, if you make any tweaks to it and forget to check them, you'll catch syntactic errors at app startup (or test framework startup) rather than having to run through and execute all the steps to hit the query before seeing any errors.
2) HQL is perfect if you have a piece of your app which needs to load in a changing set of user queries without touching code. For example, I have written a stats package for our app where the admin can add new HQL queries to an XML config file to generate statistics about how the app is being used. The results then feed into a series of jfreechart/cewolf pages to be displayed graphically, all without touching the core java code.
2) To me, the most interesting thing about the Criteria API is the query by example (QBE) piece. However, I can rarely use that because I depend on relations to other entities in my queries so much. If this code is incorporated:
http://opensource2.atlassian.com/projec ... se/HHH-408
or even a subset of it, I think Criteria will be much more powerful.