阅读量:0
在 Querydsl 中,要实现分页查询,你需要使用 QueryResults
和 fetchResults()
方法。以下是一个简单的示例,展示了如何在 Querydsl 中实现分页查询:
- 首先,确保你已经添加了 Querydsl 相关的依赖。对于 Maven 项目,你可以在
pom.xml
文件中添加以下依赖:
<groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>4.4.0</version> </dependency>
创建一个实体类(例如
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<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); }
- 现在你可以在控制器中调用
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); } }
这样,你就可以通过发送一个包含 page
、size
、sortBy
和 direction
参数的 GET 请求到 /users
端点来实现分页查询。