当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring数据和QueryDSL执行带有分页的JPAQuery

汪凌
2023-03-14

我已将此请求queryDSL配合使用:

 Iterable<AO> query_result = new JPAQuery(entityManager).from(ao)
            .leftJoin( ao.lots , lot )
            .leftJoin( ao.acs , ac )
              .where(where).distinct()
                .list(ao);

但是,如果我们将它与spring data jpa一起使用,那么它的等价物是什么

ao_respository.findAll(Predicate arg0, Pageable arg1);

因为我想返回一个页面,只是用查询,它不会在没有Spring数据jpa的情况下实现页面

我试图把我的位置放在谓词arg0中,但我得到了这个例外

Undeclared path 'lot '. Add this path as a source to the query to be able to reference it

其中lot声明为QLot lot=QLot.lot;


共有3个答案

苏承载
2023-03-14

如果您在querydsl中有一个有效的复杂查询,并且希望使用springdata分页,您必须:

>

  • 使querydsl/repository方法返回Page

     Page<YourEntity> yourSelect(Pageable aPageable)
    

    使用querydsl offset和< code>limit对结果集进行分页

    List<YourEntity>  theResultList = jpaQueryFactory
                    .select(<whatever complext jpaquery you like>)
                    .offset(aPageable.getOffset())
                    .limit(aPageable.getPageSize())
                    .fetch();                                                          
    

    提供一个< code > long supplier 来计算与您的查询相关的所有可用结果,并使用< code > PageableExecutionUtils 将结果作为< code>Page返回

    final long theCount = jpaQueryFactory
          .selectFrom(<your select to count all results>)
          .fetchCount();
    
    return PageableExecutionUtils.getPage(theResultList, aPageable, () -> theCount);
    

  • 韩朝斑
    2023-03-14
    匿名用户

    返回一个< code >页面:

    JPAQuery query = 
        ...
        .orderBy(getOrderSpecifiers(pageable, MyEntity.class))
        .limit(pageable.getPageSize())
        .offset(pageable.getOffset());
    
    long total = query.fetchCount();
    List<MyEntity> content = query.fetch();
    return new PageImpl<>(content, pageable, total);
    

    我创建了这个函数来获取订单指定器

    private OrderSpecifier[] getOrderSpecifiers(@NotNull Pageable pageable, @NotNull Class klass) {
    
        // orderVariable must match the variable of FROM
        String className = klass.getSimpleName();
        final String orderVariable = String.valueOf(Character.toLowerCase(className.charAt(0))).concat(className.substring(1));
    
        return pageable.getSort().stream()
                .map(order -> new OrderSpecifier(
                        Order.valueOf(order.getDirection().toString()),
                        new PathBuilder(klass, orderVariable).get(order.getProperty()))
                )
                .toArray(OrderSpecifier[]::new);
    }
    

    郏兴贤
    2023-03-14

    我创建了自己的 Page 类并执行了如下查询:

        JPAQuery query = new JPAQuery(entityManager).from(ao)               
                .leftJoin( .. ).fetch()
                .leftJoin( .. ).fetch()
                ...
                .where(where)
    
    
    
    
        MaPage<AO> page = new MaPage<AO>();
        page.number = pageNumber+1;
    
        page.content = query.offset(pageNumber*pageSize).limit(pageSize).list(ao);
    
        page.totalResult = query.count();
    

    我的页面类:

    public class MaPage<T> {
    
        public List<T> content;
        public int number;
        public Long totalResult;
        public Long totalPages;
        ...
    }
    

    它工作,但我得到了这个警告

    2014年11月21日上午6:48:54 org.hibernate.hql.internal.ast。QueryTranslatorImpl列表WARN:HHH000104:使用集合提取指定的firstResult/maxResults;在内存中应用!

     类似资料:
    • QueryDSL定义了一个接口,通过调用或可以轻松地为任何字段获取该接口的实例。Spring Data JPA的接口甚至有一个方法,它将作为参数。 但是对QueryDSL一无所知,它有自己定义查询排序顺序的方法,即。它可以包含许多,它们与非常相似,只是它们不是类型安全的。 所以,如果我想做使用排序的分页查询,真的没有办法使用QueryDSL来定义它吗?

    • 我有一个这样的实体层次结构。除了一些常见属性外,一些属性仅由少数子类型共享: 使用QueryDSL,我试图根据动态筛选标准搜索人员,如: 这似乎不是正确的方式,然而,我得到了很多错误,比如“薪水”不是一个人的成员。 处理层次实体搜索的各种方法有哪些?为了类型安全,我更喜欢QueryDSL,但使用Spring数据规范的解决方案也可以。 编辑:使用15种不同的搜索标准,搜索标准可能会变得非常复杂。所以

    • 问题内容: 在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是在启动时遇到了问题。 根据spring-data文档中使用的示例50,可以指定查询本身和countQuery,如下所示: 出于好奇,在课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询: 我的查询中包含一个参数,所以是的,但它也在寻找或序列里

    • 在一个web项目中,使用最新的spring-data(1.10.2)和MySQL5.6数据库,我试图使用带分页的本机查询,但在启动时遇到的是。 根据示例50,在使用来自spring-data文档的@query时,可以指定查询本身和countQuery,如下所示: 出于好奇,在类中,我可以看到它包含以下代码,以检查它是否是有效的jpa查询: 我的查询包含一个参数,因此是,但它也在中查找一个或序列,我

    • 我有一个类,它返回一个<代码>列表 在我的存储库中,我有一个可分页对象,它应该从第0页开始每页返回2个项目。它具有以下属性: 然后我创建一个页面 ... 这就是回归的原因: 我通过

    • 我有一个简单的查询如下“select * from USERS”。我还使用Pageable来启用分页。 此查询可能具有基于给定参数是否为 null 的可选谓词。 例如,如果给定了“code”参数且该参数不为空,则查询变为“select * from USERS where code =:code”; 据我所知,我不能使用@Query注释来实现这一点。我可以实现一个定制的存储库,并使用EntityM