hydrate() is not something you can use, it's an internal method in the query class, which processes rows in the result, and splits join data (for related models) into different objects.
You can run custom queries using DB calls, and use as_object('Model_Something') to return the result as ORM model objects.
There are some restrictions, one being the primary key needs to be part of the result. Also, there is no support for relations when you do that.
In general, an ORM isn't the most suitable tool for complex operations. If you have something really complex, run a standard DB query, get the list of PK's from the result, and use that to run a "WHERE pk IN {list-of-keys} ORM query...