gpt4 book ai didi

java - 在 JPA EntityManager createNativeQuery 中实现分页

转载 作者:行者123 更新时间:2023-11-30 05:24:31 25 4
gpt4 key购买 nike

我正在使用 JPA EntityManager createNativeQuery 编写查询我想应用分页。以下是我迄今为止实现的代码:

private static final int NO_OF_RESULTS_IN_A_PAGE = 30;

public Page<Car> getFilteredCars(int page, String model, String manufacturedYear) {
Pageable pageable = PageRequest.of(page, NO_OF_RESULTS_IN_A_PAGE, Sort.by("addedDate").descending());
StringBuilder sb = new StringBuilder("SELECT c.* FROM car c WHERE c.model = ").append(model).append(" AND");
if(manufacturedYear != null) {
sb.append(" c.manufactured_year = ").append(manufacturedYear).append(" AND");
}
sb.append(" c.for_sale = true ORDER BY c.added_date DESC");

Query query = entityManager.createNativeQuery(sb.toString(), Car.class);
query.setFirstResult(page * NO_OF_RESULTS_IN_A_PAGE);
query.setMaxResults((page * NO_OF_RESULTS_IN_A_PAGE) + NO_OF_RESULTS_IN_A_PAGE);

Page<Car> results = new PageImpl<>(query.getResultList(), pageable, 0);
return results;
}

问题在于 new PageImpl<>构造函数中,我必须将项目总数作为第三个参数传递。在查询运行之前,我不知道有多少项。如果我传递 0(如上面的代码所示),即使数据库中实际有超过 1000 个项目,我也只会返回第一页,总项目数将为 30。 PageImpl 还有一个更简单的构造函数仅采用一个参数( query.getResultList() ),但结果将不分页。这导致我运行查询两次,一次是为了获取从查询返回的项目总数(未分页),然后使用它来获取分页结果。显然必须有更好的方法来实现这一目标,但我一直无法弄清楚。

请注意,我的实际查询比上面描述的查询要复杂得多,涉及多个 if-else 条件检查,因此不适合通过简单的 JpaRepository 进行查询实现或使用 @Query用它可以轻松实现分页。

最佳答案

我担心除了让数据库在执行实际选择之前通过附加查询来计算汽车总数之外,没有其他方法了。喜欢

SELECT count(1) FROM car c WHERE c.model = ...

简单计数比返回 n>1 行的选择要快得多。当然,计数会减慢执行速度,但在现代数据库上,这只会花费几毫秒 - 这是我们人类无法识别的;-)

关于java - 在 JPA EntityManager createNativeQuery 中实现分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58930250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com