现状说明:
      公司之前已经封装好了,传入一个hql,执行分页查询。这块没问题。
有个求数量的,对同样的hql,进行去order by等,然后用hibernate工具转sql,再一些select方面的处理,增加count(*)。也没啥问题。
     现在准备做saas,每个表都增加了1个租户ID,为了减少后台不必要的代码,我决定使用hibernate的enableFilter,每个查询默认拼上租户ID,但是分页求总数这块,由于转成了sql,enableFilter对普通sql失效,租户ID并没有拼上,造成总数显示过多。
    比如传入的hql:selct p from Person p
     进行了以下尝试:
     1.同一个hql查询,query.list().size();//几万条数据就能内存溢出。
     2.查询和求总数必须写2个hql执行。//这不太可能。
     3.ScrollableResults游标性质的,其实类似query.list(),但是不会内存溢出,效率比count(*)慢20倍
     4.select count(*)from (selct p from Person p);//hql不支持这样写。最可恨的
     5.使用字符串处理hql,但情况太多,比如"from Person","select a,b from Person","select distinct a form Person"。
我现在能想到的方式:简单的 from Person,追加个select count(*),复杂的select distinct a form Person,使用第3种游标,但肯定不是good idea,求大神帮助像个更好招。
实在不行,只能放弃enableFilter,3天的尝试那就白费了
分页,总数,hibernate

解决方案 »

  1.   

    求总数这块,hql也是支持的,能不转sql吗,这样都走filter,查询条件就一致了
      

  2.   

    不转sql当然最好,最好的方法是找个工具能把hql查询变成count的
    如:select distinct perId from Person-》select count(distinct perId) from Person;
    from Person-》select count(*) from Person;
    select a,b from Person-》------------