Because to get the data from the database’s cache, you still have to:
- Generate the SQL from the ORM’s “native” query format
- Do a network round-trip to the database server
- Parse the SQL
- Fetch the data from the cache
- Serialise the data to the database’s over-the-wire format
- Deserialize the data into the database client library’s format
- Convert the database client librarie’s format into language-level objects (i.e. a collection of whatevers)
By caching at the application level, you don’t have to do any of that. Typically, it’s a simple lookup of an in-memory hashtable. Sometimes (if caching with memcache) there’s still a network round-trip, but all of the other stuff no longer happens.