While joins are probably the optimal solution for performance whenever possible, it isn't always worth the complexity that may be required; the performance impact may be minimal given the context that you are working with, so you choose lazy fetching.
Because of the nature of an object-level querying and criteria system, the results returned by a query in an O/R mapping tool will potentially be much more coarse than what you might be able to achieve via standard JDBC calls.