在 Querydsl 中,要實現分頁查詢,你需要使用 QueryResults
和 fetchResults()
方法。以下是一個簡單的示例,展示了如何在 Querydsl 中實現分頁查詢:
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
端點來實現分頁查詢。