When it comes to implementing a persistence based solution, you have many options. Hibernate is one, and one of the best, but as you know, it's not a one size fits all tool.
The key to Hibernate is that it allows you to approach your problem domain from an object oriented standpoint. If your problem domain can be approached in an object oriented manner, and you can have those objects mapped to your database, then Hibernate is absolutely the perfect choice.
With every solution, there are times when the persistent object model won't do everything you need it to do. Certainly, HQL can help you out immensely, and you can write very complicated joins and SQL queries if the need arises, while at the same time, leveraging the Hibernate Session and Hibernate framework.
Furthermore, when the need arises, you can also issue native SQL queries from Hibernate too, so you can really combine all the features of Hibernate that make sense, along with a few SQL queries to give you very fine grained control over your application.
Here's a little intro to Hibernate and a description of some of the reasons so many people are using Hibernate and JPA:
http://jpa.ezhibernate.com/Javacode/learn.jsp?tutorial=23whatishibernate