如果有一个查询从视图中选择前50行:
select * from device_overview order by device_id asc offset 0 rows fetch next 50 rows only
如果我使用sql profiler,我可以看到它已翻译为
declare @p1 int
set @p1=180150031
declare @p2 int
set @p2=50
exec sp_cursoropen @p1 output,N'select * from device_overview
order by device_id asc offset 0 rows fetch next 50 rows only',8,8193,@p2 output
select @p1, @p2
我从运行为ORM的Spring Boot应用程序中运行相同的查询时,查询转换为
exec sp_executesql N'select deviceover0_.id as id1_8_,
/*...all other fields ommitted..*/
from dbo.device_overview deviceover0_
order by deviceover0_.device_id asc offset 0 rows fetch next @P1 rows only ,@P1 int,50
后者消耗的CPU功率要大得多,并且在Azure SQL上运行时达到了我们计划的DTU限制。
是否有一种方法可以告诉hibernate以与上述相同的方式使用游标而不是简单地执行语句来生成查询?我尝试在数据源网址中使用; selectMethod = cursor,但对此没有任何影响。