S2JDBCのSQL自動生成機能は、基本的に素晴らしいです。はるか昔にHibernateを使った時のもどかしさは、ほとんどありません。ただ、たまーに結合のチューニングしたいなぁと思うことがあります。
例えば、AテーブルとBテーブルをジョインして、ページングで制限する場合です。
自動生成の場合、ジョインした結果に対して制限します。
SELECT * FROM (SELECT T1_.A_ID FROM A_TABLE T1_ left outer join B_TABLE T2_ on T1_.A_ID = T2_.A_ID WHERE (T1_.CD = 'hoge') ) WHERE rownum <= 100
動きとしては、圧倒的に正しいです。
ただAテーブルとBテーブルがそれぞれ10万件あった場合は、かなりの時間が掛かります。検索の条件がAテーブルだけと確定している場合であれば、下記のようにAテーブルの検索条件+件数制限をしてBテーブルに結合した場合が圧倒的に早いです。
SELECT * FROM (SELECT * FROM A_TABLE WHERE (T1_.CD = 'hoge') AND rownum <= 100 ) T1_ left outer join B_TABLE T2_ on T1_.A_ID = T2_.A_ID
設計実装の話としては、一般的にはAテーブルだけ取得してJavaの中でBテーブルを呼び出して結合させるというのがモダンな造りだと思います。ただ、ごく稀にSQL的に完結させたいなぁという場合もあります。そんな時に、自動生成の方でもチューニング出来たらありがたいなぁと思います。(SQLファイルで書くと、色々制約がついて面倒臭いので)
まぁ、フレームワークの設計思想としては、8割のケースに全力で対応して2割のケースを切り捨てるというのが正しいと思います。過去の肥大化して自壊していった数々の例をみていると。
とここまで書いていて、.where("")でつらつら書いていけば出来るかなぁという気になってきました。