如何使用休眠跟踪结果集大小?

Dan*_*gel 10 java sql orm hibernate jdbc

我正在尝试检测和优化Java/Hibernate应用程序中的低效连接.我注意到在某些情况下,由于结果集中如何处理联接的性质,线上数据流的效率非常低.

让我举个例子.假设您有一个如下所示的HQL查询:

select s from Store s
left join fetch s.items i
left join fetch s.employees e
left join fetch s.customers c
where s.id = :id
Run Code Online (Sandbox Code Playgroud)

(暂时忽略这不是一个聪明的查询 - 这只是一个简化的例子).

如果您想象某个商店有1000个商品,10个员工和100个客户,您将获得一个包含1111个实体的Java对象树.这可能会让你误以为从数据库中返回了大约1111行,而实际上结果集有1,000,000行!

所有列的存在使这更糟.如果你想象每个表有5列,你可能会想到你有大约5555个"项目",而结果集中的单元格数(行*列)实际上是20,000,000.

显然,应用程序开发人员有责任了解此问题,而不是以这种方式编写查询.然而,这有时会无意地(并且以不太严格的方式)发生,并且能够检测应用程序以某种方式识别这些情况将是很好的.

但是,我一直无法找到任何方法来计算(在Java/Hibernate应用程序中)原始结果集中的行数或列数.Hibernate拦截器,Hibernate事件和Hibernate统计数据似乎都无法访问这些信息.

有什么建议?提前致谢.

小智 -1

行数?“选择计数...”(它不像执行两次。计数执行得更快)列数?反射。摆弄 Class.getDeclaredMethods();