Spring Data JPA一对多假分页问题

程序员甲 发布于 2017/05/27 16:49
阅读 760
收藏 0

Sping Data JPA + hibernate

我遇到一个问题,在调用JpaSpecificationExecutor.findAll(Specification spec, Pageable pageable)方法时,当被查询的这个entity有一对多的关联关系时,为了防止N+1,我使用了fetch或者@EntityGraph。但之后生成的sql中可以看到没有limit语句了(数据库是mysql)。

去掉fetch或者@EntityGraph,sql中limit又回来了。

log中也可以明显看到封装关联关系对象的数量比查询的数据量多的多,所以可以判断是假分页。

请问有什么方案可以在JPA 一对多中避免N+1的同时,做真分页查询吗?

简单实例:

对象关系

public class Header {
    @OneToOne
    private DetailA detailA;
    @OneToMany
    private List<DetailB> detailBs;
}

Service调用查询

public class Service {
    public Page<Header> listHeaderTemp(SomeCriteria criteria, Pageable pageable) {
        //调用dao查询方法
        return headerRepository.findAll((root, query, cb) -> {
            if (!query.getQueryTpye.equals(Long.class)){
                root.fetch("detailBs", JoinType.LEFT);
            }
            List<Predicate> predicates = new ArrayList<>();
            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        }, pageable);
    }
}

 

加载中
返回顶部
顶部