繁体   English   中英

如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?

[英]How to convert a list of enity object to page object in Spring MVC (JPA)?

我有一个实体List 如何使用 Spring MVC 4 和 Spring Data JPA 将其转换为Page对象?

有一个Page实现

final Page<Something> page = new PageImpl<>(theListOfSomething);

还有一个构造函数

Page<FOO> page = new PageImpl<>(listOfsomething, pageable, listOfsomething.size());

我认为您还需要获取正确的页面内容。


PageRequest pageRequest = PageRequest.of(offset, limit);

List<Product> products = getProducts();

int total = products.size();
int start = toIntExact(pageRequest.getOffset());
int end = Math.min((start + pageRequest.getPageSize()), total);

List<Product> output = new ArrayList<>();

if (start <= end) {
    output = products.subList(start, end);
}

return new PageImpl<>(
    output,
    pageRequest,
    total
);

您可以将列表传递给函数以使其成为可分页对象。 如果子列表的起始值小于列表大小,则返回空内容。

  public Page<?> toPage(List<?> list, Pageable pageable) {
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), list.size());
        if(start > list.size())
            return new PageImpl<>(new ArrayList<>(), pageable, list.size());
        return new PageImpl<>(list.subList(start, end), pageable, list.size());
    }

以上答案都假设列表是您希望返回的内容。 以下是对包含记录的列表执行分页的操作。

//pageNum starts with 1
//size: page size
//totalRecords, total records
Page<Record> myMethod(int pageNum, int size, List<MyRecord> totalRecords){
    if(pageNum<1){
        pageNum = 1;
    }
    if(size < 1){
        size = 10;
    }
    //spring page starts with 0
    Pageable pageable = new PageRequest(pageNum-1, size);
    //when pageNum * size is too big(bigger than list.size()), totalRecords.subList() will throw a exception, we need to fix this
    if(pageable.getOffset() > list.size()){
            pageable = new PageRequest(0, size);
    }
    List<MyRecord> pageRecords = totalRecords.subList(pageable.getOffset(), Math.min(pageable.getOffset() + pageable.getPageSize(), totalRecords.size()));
    
    Page springPage = new PageImpl<>(pageRecords, pageable, totalRecords.size());
    return springPage;
}

通常,控制器应该接收一个Pageable对象作为参数。 Pageable对象包含页码、页面大小和排序信息。

然后你可以通过排序从JpaRepository查询所有实体并生成Page对象:

List<Entity> allList = jpaRepository.findAll(pageable.getSort());

List<Entity> pageList = allList.stream()
    .skip(pageable.getPageSize() * pageable.getPageNumber())
    .limit(pageable.getPageSize())
    .collect(Collectors.toList());

return new PageImpl<>(pageList, pageable, allList.size());

Java如何转换List<object> 从 JPA 到页面<div id="text_translate"><p>我对来自 Jpa 存储库的自定义搜索方法有疑问。 我将此方法实施到自定义 serach,在此方法中,我有来自我的 SQL 基础的<strong>列表</strong>,我尝试将其从 JPA 转换为<strong>页面</strong>object 这只是分页的错觉,因为在邮递员/互联网浏览器中,我看到列表中的所有元素,当我更改端点中的页面和大小值时,什么都没有改变。 有人知道如何帮助吗?</p><p> GitHub 项目: <a href="https://github.com/s0bieskii/DemoCarRental" rel="nofollow noreferrer">https://github.com/s0bieskii/DemoCarRental</a></p><p> <strong>我的端点来自 Controller:</strong></p><pre> @GetMapping("/find") ResponseEntity&lt;Page&lt;CarDTO&gt;&gt; readAllCarsFiltered(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "5") int size, Pageable pageable, @RequestParam(required = false) String brand, @RequestParam(required = false) String model, @RequestParam(required = false) String type, @RequestParam(required = false) Integer registrationYear, @RequestParam(required = false) String color, @RequestParam(required = false) String fuel, @RequestParam(required = false) String transmission, @RequestParam(required = false) String doors, @RequestParam(required = false, defaultValue = "9999999999") double price) { return ResponseEntity.ok(carService.customerSearch(pageable, brand, model, type, registrationYear, color, fuel, transmission, doors, price)); }</pre><p> <strong>我的服务</strong></p><pre>public Page&lt;CarDTO&gt; customerSearch(Pageable pageable, String brand, String model, String type, Integer registrationNumber, String color, String fuel, String transmission, String doors, double price){ return carRepository.search(pageable, brand, model, type, registrationNumber, color, fuel, transmission, doors, price).map(car -&gt; carMapper.carToDto(car)); }</pre><p> <strong>我来自 RepositoryImplementation 的自定义搜索方法</strong></p><pre> @Override public Page&lt;Car&gt; search(Pageable pageable, String brand, String model, String type, Integer registrationYear, String color, String fuel, String transmission, String doors, double price) { int var = 0; CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery&lt;Car&gt; query = cb.createQuery(Car.class); Root&lt;Car&gt; car = query.from(Car.class); query.select(car); Predicate predicate = cb.greaterThan(car.get("id"), var); if (brand.= null) predicate = cb,and(predicate. cb.equal(car,get("brand"); brand)). if (model,= null) predicate = cb.and(predicate. cb,equal(car;get("model"). model)), if (type.= null) predicate = cb.and(predicate, cb;equal(car.get("type"), type)). if (registrationYear.= null) predicate = cb,and(predicate; cb.equal(car,get("registrationNumber"). registrationYear)). if (color,= null) predicate = cb;and(predicate. cb,equal(car.get("color"). color)), if (fuel.= null) predicate = cb;and(predicate. cb,equal(car.get("fuel"). Fuel,stringToFuelEnum(fuel))). if (transmission;= null) predicate = cb.and(predicate, cb.equal(car.get("transmission"), Transmission;stringToTransmissionEnum(transmission))). if (doors,= null) predicate = cb.and(predicate. cb,equal(car;get("doors"). doors)), if (price.= 0) predicate = cb.and(predicate, cb;lessThan(car.get("price"). price)). //predicate = cb;and(predicate, cb,equal(car.get("available"); available)); List&lt;Car&gt; carList=entityManager.createQuery(query.where(predicate)).getResultList(); return new PageImpl&lt;Car&gt;(carList, pageable,carList.size()); } }</pre></div></object>

[英]Java how to transform List<Object> to Page from JPA Paggination

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 转换列表<map<string, string> &gt; 到 Object 中 Java Spring 启动 ZF0B4A299C45171493AE3215D69D </map<string,> 如何转换清单 <Object> JPA本机查询访问POJO 如何在Spring MVC中绑定命令对象的列表集合中的对象 使用域对象Spring MVC JPA Rest的JPA查询 如何在对象Spring JPA(Jhipster)中创建对象 Spring MVC中的对象绑定列表 Java如何转换List<object> 从 JPA 到页面<div id="text_translate"><p>我对来自 Jpa 存储库的自定义搜索方法有疑问。 我将此方法实施到自定义 serach,在此方法中,我有来自我的 SQL 基础的<strong>列表</strong>,我尝试将其从 JPA 转换为<strong>页面</strong>object 这只是分页的错觉,因为在邮递员/互联网浏览器中,我看到列表中的所有元素,当我更改端点中的页面和大小值时,什么都没有改变。 有人知道如何帮助吗?</p><p> GitHub 项目: <a href="https://github.com/s0bieskii/DemoCarRental" rel="nofollow noreferrer">https://github.com/s0bieskii/DemoCarRental</a></p><p> <strong>我的端点来自 Controller:</strong></p><pre> @GetMapping("/find") ResponseEntity&lt;Page&lt;CarDTO&gt;&gt; readAllCarsFiltered(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "5") int size, Pageable pageable, @RequestParam(required = false) String brand, @RequestParam(required = false) String model, @RequestParam(required = false) String type, @RequestParam(required = false) Integer registrationYear, @RequestParam(required = false) String color, @RequestParam(required = false) String fuel, @RequestParam(required = false) String transmission, @RequestParam(required = false) String doors, @RequestParam(required = false, defaultValue = "9999999999") double price) { return ResponseEntity.ok(carService.customerSearch(pageable, brand, model, type, registrationYear, color, fuel, transmission, doors, price)); }</pre><p> <strong>我的服务</strong></p><pre>public Page&lt;CarDTO&gt; customerSearch(Pageable pageable, String brand, String model, String type, Integer registrationNumber, String color, String fuel, String transmission, String doors, double price){ return carRepository.search(pageable, brand, model, type, registrationNumber, color, fuel, transmission, doors, price).map(car -&gt; carMapper.carToDto(car)); }</pre><p> <strong>我来自 RepositoryImplementation 的自定义搜索方法</strong></p><pre> @Override public Page&lt;Car&gt; search(Pageable pageable, String brand, String model, String type, Integer registrationYear, String color, String fuel, String transmission, String doors, double price) { int var = 0; CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery&lt;Car&gt; query = cb.createQuery(Car.class); Root&lt;Car&gt; car = query.from(Car.class); query.select(car); Predicate predicate = cb.greaterThan(car.get("id"), var); if (brand.= null) predicate = cb,and(predicate. cb.equal(car,get("brand"); brand)). if (model,= null) predicate = cb.and(predicate. cb,equal(car;get("model"). model)), if (type.= null) predicate = cb.and(predicate, cb;equal(car.get("type"), type)). if (registrationYear.= null) predicate = cb,and(predicate; cb.equal(car,get("registrationNumber"). registrationYear)). if (color,= null) predicate = cb;and(predicate. cb,equal(car.get("color"). color)), if (fuel.= null) predicate = cb;and(predicate. cb,equal(car.get("fuel"). Fuel,stringToFuelEnum(fuel))). if (transmission;= null) predicate = cb.and(predicate, cb.equal(car.get("transmission"), Transmission;stringToTransmissionEnum(transmission))). if (doors,= null) predicate = cb.and(predicate. cb,equal(car;get("doors"). doors)), if (price.= 0) predicate = cb.and(predicate, cb;lessThan(car.get("price"). price)). //predicate = cb;and(predicate, cb,equal(car.get("available"); available)); List&lt;Car&gt; carList=entityManager.createQuery(query.where(predicate)).getResultList(); return new PageImpl&lt;Car&gt;(carList, pageable,carList.size()); } }</pre></div></object> 退货清单<object[]>与 spring JPA BeanPropertyRowMapper</object[]> 如何在 Spring MVC 中发送 id 而不是整个 object ??? (休眠/Spring-Data-JPA) 如何在 List 中接收 JavaScript 对象列表<Object>在 Spring MVC 中?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM