JPAはどれだけSQLの方言の差異を吸収できるのか

JPASQLの方言の差異を吸収するけど、具体的に何を吸収してくれるのか。ちょっと整理。

ページングの構文の違い

たとえば、Oracleだとrownumと副問い合わせを組み合わせて実現するけど、MySQLだとlimit/offsetを使うとか。

ファンクションの違い(文字列操作、日付など)

たとえば、JPAでconcat関数を使うと、Oracleは「||」で文字列連結するけど、SQLServerだと「+」で文字列連結するとか。

時間型の違い

たとえば、java.util.Dateの時刻の値をOracleではDATE型にマッピングするけど、MySQLだとTIME型にマッピングするとか。

LOB型の違い

たとえば、Javaのbyte配列をOracleだとBLOB型にマッピングするけど、SQLServerだとIMAGE型にマッピングするとか。
これらの型はJDBCでの扱いが結構異なるけど、そこを吸収してくれるところがうれしい。

悲観的ロックの構文の違い

JPAとしてはサポートされていないけど、HibernateToplink Essentialsでは使えるから事実上サポートされているとみなしていいと思う。
たとえば、Oracleだと「for update」がSELECT文に追加されて、SQLServerだとだと「with (updlock, rowlock)」がSELECT文に挿入されるとか。


代表的なものはこんなものだと思う。主キーの自動生成についてもいろんな工夫がされているけど、Tableを使った自動生成を使うとどのRDBMSでも一緒なのであえてここでは挙げない。