One of my co-workers maintains that integration tests are all kinds of bad and wrong - everything must be unit-tested,
That's a little like saying that antibiotics are bad - everything should be cured with vitamins.
Unit tests can't catch everything - they only test how a component works in a controlled environment. Integration tests verify that everything works together, which is harder to do but more meaningful in the end.
A good, comprehensive testing process uses both types of tests - unit tests to verify business rules and other things that can be tested independently, and integration tests to make sure everything works together.
Short of integration testing with a real connection object, how can I know that this is actually generating real queries - and that those queries actually do what I think they do?
You could unit test it at the database level. Run the query with various parameters and see if you get the results you expect. Granted it means copying/pasting any changes back into the "true" code. but it does allow you to test the query independent of any other dependencies.