hibernate.query.fail_on_pagination_over_collection_fetch 错误分析

起因是因为开发中遇到问题了报错,具体的截图如下所示

hibernate.query.fail_on_pagination_over_collection_fetch 错误分析

所以后面搜索了下相关的内容,看到有一篇博客写的蛮不错的,地址是

https://vladmihalcea.com/hibernate-query-fail-on-pagination-over-collection-fetch/

来简单的陈述下原因:

出错的hiberate版本是5.1.11;主要出错的原因是在获取实体的列表的时候分页同时这个实体里面还包含了集合的元素,我的代码里面是使用root.fetch()来获取集合的属性;文中举了个例子,比如查询博客和博客的评论的接口,需要做分页,可以根据博客的标题做模糊匹配,同时需要获取到博客的评论;

这里会有个“HHH000104 ”的警告,是说分页是在内存中进行的;举个例子来说,如果库中有100篇博客,每个博客有50个评论,那么查询结果是100*50=5000条数据返回;之后在内存中去做筛选的,根据当前的分页情况,筛选满足条件的博客;所以当这个数据量比较多的时候,就会有性能问题;当然在springboot中这个开关是可以配置的,如图所示

hibernate.query.fail_on_pagination_over_collection_fetch 错误分析

设置成true,会报错;设置成false就是分页获取数据的时候不会报错;但是仍然建议这个值设置成ture,内存中分页仍然是不可取的;

具体的做法是先获取这些数据,不获取entity里面的集合属性的数据,比如上面中提到的博客的评论,然后查询出分页的结果后,再去填充这部分内容,一次性查出来;或者先获取这些满足条件的博客的id列表,然后join下评论,这样也是可以的;