<p>I have a daily batch process that involves selecting out a large number of records and formatting up a file to send to an external system.  I also need to mark these records as sent so they are not transmitted again tomorrow.</p>

<p>In my naive JDBC way, I would prepare and execute a statement and then begin to loop through the recordset.  As I only go forwards through the recordset there is no need for my application server to hold the whole result set in memory at one time.  Groups of records can be feed across from the database server.</p>

<p>Now, lets say I'm using hibernate.  Won't I endup with a bunch of objects representing the whole result set in memory at once?</p>

Hibernate does also iterate over the result set so only one row is kept in memory. This is the default. If it to load greedily, you must tell it so.
Reasons to use Hibernate:
"Someone" was "creative" with the column names (PRXFC0315.XXFZZCC12)
The DB design is still in flux and/or you want one place where column names are mapped to Java.
You're using Hibernate anyway
You have complex queries and you're not fluent in SQL
Reasons
not
to use Hibernate:
The rest of your app is pure JDBC
You don't need any of the power of Hibernate
You have complex queries and you're fluent in SQL
You need a specific feature of your DB to make the SQL perform