querydsl中如何实现分页查询

1949idc 2年前 (2024-09-18) 阅读数 429 #编程语言

在 Querydsl 中,要实现分页查询,你需要使用 QueryResultsfetchResults() 方法。以下是一个简单的示例,展示了如何在 Querydsl 中实现分页查询:

  1. 首先,确保你已经添加了 Querydsl 相关的依赖。对于 Maven 项目,你可以在 pom.xml 文件中添加以下依赖:
   <groupId>com.querydsl</groupId>
   <artifactId>querydsl-jpa</artifactId>
   <version>4.4.0</version>
</dependency>
  1. 创建一个实体类(例如 User)和一个 JPA Repository 接口(例如 UserRepository)。

  2. 在你的服务类或控制器类中,注入 UserRepository 并创建一个 JPAQueryFactory 实例:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    private JPAQueryFactory queryFactory;

    @PostConstruct
    public void init() {
        queryFactory = new JPAQueryFactory(userRepository.getEntityManager());
    }
}
  1. 在服务类中,创建一个分页查询方法。例如,你可以创建一个名为 findUsers 的方法,该方法接受当前页码、每页显示的记录数和排序参数作为参数:
public Page<User> findUsers(int page, int size, Sort sort) {
    QUser user = QUser.user;
    long total = queryFactory.selectFrom(user).fetchCount();

    List<User> content = queryFactory
            .selectFrom(user)
            .orderBy(toOrderSpecifier(sort))
            .offset((page - 1) * size)
            .limit(size)
            .fetch();

    return new PageImpl<>(content, PageRequest.of(page, size, sort), total);
}

private OrderSpecifier<?>[] toOrderSpecifier(Sort sort) {
    return sort.stream()
            .map(order -> {
                PathBuilder<Object> pathBuilder = new PathBuilder<>(Object.class, "user");
                return new OrderSpecifier(order.isAscending() ? Order.ASC : Order.DESC, pathBuilder.get(order.getProperty()));
            })
            .toArray(OrderSpecifier[]::new);
}
  1. 现在你可以在控制器中调用 findUsers 方法来实现分页查询:
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public ResponseEntity<Page<User>> getUsers( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "id") String sortBy, @RequestParam(defaultValue = "asc") String direction) {
        Sort sort = Sort.by(sortBy).withDirection(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC);
        Page<User> users = userService.findUsers(page, size, sort);
        return ResponseEntity.ok(users);
    }
}

这样,你就可以通过发送一个包含 pagesizesortBydirection 参数的 GET 请求到 /users 端点来实现分页查询。

版权声明

本文内容由互联网用户自发贡献,该文观点仅代表作者本人
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

© 2010 首途云安 & 厦门硕顿信息技术有限公司 & 闽ICP备11016866号  增值电信业务经营许可证:B1-20203020 地址:福建厦门思明区嘉禾路297号1806
高新技术企业
软件产品证书
计算机软件著作权
ISO认证
国家3A企业