読者です 読者をやめる 読者になる 読者になる

Doma 2.2.0 から SQL Server のページングがちょっとだけ便利になりました。

domaframework/doma · GitHub の 2.2.0 がリリースされました。
この中で SQL Server (2012以降) でのページング機能がちょっとだけ便利になりました。

従来ですと、offset を指定すると ORDER BY では SELECT で指定しているカラム全てを含む必要がありました。
今回からは、ORDER BY があるだけで良くなりました。
検索 — Doma 2.0 ドキュメント

offset=5 limit=10 の時の例でみると
従来ならこんなクエリが

select emp.id, emp.name from emp order by emp.id, emp.name

このように変換されていました。

select * 
from ( 
  select temp_.*, 
    row_number() over( order by temp_.id, temp_.name ) as doma_rownumber_ 
  from ( select emp.id, emp.name from emp ) as temp_ 
) as temp2_ 
where doma_rownumber_ > 5 and doma_rownumber_ <= 15 

今回からは

select emp.id, emp.name 
from emp 
order by emp.id, emp.name 
offset 5 rows fetch next 10 rows only

となります。

SQL Server 2012 で追加された OFFSET FETCH を利用するように変更されています。
ORDER BY 句 (Transact-SQL)
limit 指定だけの場合は OFFSET FETCH では無く、従来通りの TOP (Transact-SQL) を使うので ORDER BY が無くても大丈夫です。

常に OFFSET FETCH を使うオプションが MssqlDialect にありますが、滅多に使うことは無いと思います。

もう1点改善された点があり、クエリ ヒント (Transact-SQL) を使っている場合ページングのクエリが正しいクエリにならないという問題が解消されています。
SQL Server の OPTION 句が存在するとページングが正しく実行されない問題を修正しました fix #62 by nakamura-to · Pull Request #67 · domaframework/doma · GitHub

他の変更点は公式で確認どうぞ
Migration Guide · domaframework/doma Wiki · GitHub
リリースノート — Doma 2.0 ドキュメント