阅读量:138
在 Querydsl 中,要实现分页查询,你需要使用 QueryResults 和 fetchResults() 方法。以下是一个简单的示例,展示了如何在 Querydsl 中实现分页查询:
- 首先,确保你已经添加了 Querydsl 相关的依赖。对于 Maven 项目,你可以在
pom.xml文件中添加以下依赖:
com.querydsl
querydsl-jpa
4.4.0
-
创建一个实体类(例如
User)和一个 JPA Repository 接口(例如UserRepository)。 -
在你的服务类或控制器类中,注入
UserRepository并创建一个JPAQueryFactory实例:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
private JPAQueryFactory queryFactory;
@PostConstruct
public void init() {
queryFactory = new JPAQueryFactory(userRepository.getEntityManager());
}
}
- 在服务类中,创建一个分页查询方法。例如,你可以创建一个名为
findUsers的方法,该方法接受当前页码、每页显示的记录数和排序参数作为参数:
public Page findUsers(int page, int size, Sort sort) {
QUser user = QUser.user;
long total = queryFactory.selectFrom(user).fetchCount();
List 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);
}
- 现在你可以在控制器中调用
findUsers方法来实现分页查询:
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public ResponseEntity> 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 users = userService.findUsers(page, size, sort);
return ResponseEntity.ok(users);
}
}
这样,你就可以通过发送一个包含 page、size、sortBy 和 direction 参数的 GET 请求到 /users 端点来实现分页查询。